2011-09-26 10 views

Odpowiedz

86

Po pierwsze, kwestia kapitalizacji ma znaczenie.

@model (małe „m”) jest zarezerwowanym kluczowe w widokach Razor zadeklarować typ modelu w górnej części widoku, np:

@model MyNamespace.Models.MyModel

Później w pliku, można odwoływać się do atrybut, który chcesz z @Model.Attribute (wielkie litery "M").

@model Deklaruje model. Model odwołuje się do instancji modelu.

Po drugie, można przypisać wartość do modelu i użyć jej później na stronie, ale nie będzie ona trwała, gdy strona przejdzie do działania kontrolera, chyba że jest to wartość w polu formularza. W celu uzyskania wartości z powrotem w modelu podczas procesu modelu wiążącego, trzeba przypisać wartość do pola formularza, np:

Wariant 1

w swojej akcji kontrolera trzeba stworzyć model pierwszego widoku strony, w przeciwnym razie przy próbie ustawienia Model.Attribute obiekt Model będzie pusty.

Kontroler:

// This accepts [HttpGet] by default, so it will be used to render the first call to the page 
public ActionResult SomeAction() 
{ 
    MyModel model = new MyModel(); 
    // optional: if you want to set the property here instead of in your view, you can 
    // model.Attribute = "whatever"; 
    return View(model); 
} 

[HttpPost] // This action accepts data posted to the server 
public ActionResult SomeAction(MyModel model) 
{ 
    // model.Attribute will now be "whatever" 
    return View(model); 
} 

Widok:

@{Model.Attribute = "whatever";} @* Only do this here if you did NOT do it in the controller *@ 
@Html.HiddenFor(m => m.Attribute); @* This will make it so that Attribute = "whatever" when the page submits to the controller *@ 

Opcja 2

Albo, ponieważ modele są nazwa oparte, można pominąć tworząc model w kontrolerze i po prostu nazwij pole formularza taką samą jak twoja własność modelu. W takim przypadku ustawienie ukrytego pola o nazwie "Atrybut" na "cokolwiek" zapewni, że po przesłaniu strony wartość "cokolwiek" zostanie przypisana do właściwości modelu danego modelu podczas procesu wiązania modelu. Zauważ, że nie musi to być ukryte pole, tylko dowolne pole wejściowe HTML z name="Attribute".

Kontroler:

public ActionResult SomeAction() 
{ 
    return View(); 
} 

[HttpPost] // This action accepts data posted to the server 
public ActionResult SomeAction(MyModel model) 
{ 
    // model.Attribute will now be "whatever" 
    return View(model); 
} 

Widok:

@Html.Hidden("Attribute", "whatever");

+1

Dziękuję za to. Świetna odpowiedź. – levteck

+1

Ta odpowiedź powinna trafić do hali sławy – petric

Powiązane problemy