21 Stimmen

ASP.NET MVC - Alternative für [Bind(Exclude = "Id")]

Gibt es eine Alternative für [Bind(Exclude = "Id")] ( Verwandte Frage) ?

Könnte ich einen Musterordner schreiben?

36voto

Darin Dimitrov Punkte 990883

Ja, es gibt sie: die sogenannten Ansichtsmodelle. View-Modelle sind Klassen, die speziell auf die besonderen Bedürfnisse einer bestimmten Ansicht zugeschnitten sind.

Also stattdessen:

public ActionResult Index([Bind(Exclude = "Id")] SomeDomainModel model)

verwenden:

public ActionResult Index(SomeViewModel viewModel)

wobei das Ansichtsmodell nur die Eigenschaften enthält, die gebunden werden müssen. Dann könnte man eine Abbildung zwischen dem View Model und dem Model erstellen. Dieses Mapping könnte vereinfacht werden durch AutoMapper .

Als Best Practice würde ich Ihnen empfehlen, immer Ansichtsmodelle zu und von einer Ansicht zu verwenden.

22voto

PaulB Punkte 914

Sie können Eigenschaften direkt mit einem Attribut ausschließen;

[BindNever]

15voto

Desmond Punkte 1230

Eine sehr einfache Lösung, die ich herausgefunden habe.

public ActionResult Edit(Person person)
{
    ModelState.Remove("Id"); // This will remove the key 

    if (ModelState.IsValid)
       {
           //Save Changes;
       }
    }
}

10voto

Memet Olsen Punkte 4508

Als Ergänzung zu den bestehenden Antworten ermöglicht es C# 6, die Eigenschaft auf sicherere Weise auszuschließen:

public ActionResult Edit(Person person)
{
    ModelState.Remove(nameof(Person.Id));

    if (ModelState.IsValid)
       {
           //Save Changes;
       }
    }
}

o

public ActionResult Index([Bind(Exclude = nameof(SomeDomainModel.Id))] SomeDomainModel model)

3voto

Vedran Mandić Punkte 642

Wie Desmond sagte, finde ich entfernen sehr einfach zu bedienen, auch habe ich eine einfache Erweiterung, die in praktisch für mehrere Requisiten zu ignorieren kommen kann gemacht ...

    /// <summary>
    /// Excludes the list of model properties from model validation.
    /// </summary>
    /// <param name="ModelState">The model state dictionary which holds the state of model data being interpreted.</param>
    /// <param name="modelProperties">A string array of delimited string property names of the model to be excluded from the model state validation.</param>
    public static void Remove(this ModelStateDictionary ModelState, params string[] modelProperties)
    {
        foreach (var prop in modelProperties)
            ModelState.Remove(prop);
    }

Sie können es in Ihrer Aktionsmethode wie folgt verwenden:

    ModelState.Remove(nameof(obj.ID), nameof(obj.Prop2), nameof(obj.Prop3), nameof(obj.Etc));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X