2015-03-25 2 views
3

У меня есть эти две строки в шаблоне Razor:Различные значения от модели

@Html.Hidden("step", Model.Step) 
<p>@Html.Label(Model.Step.ToString())</p> 

И они производят два различных значения:

<input data-val="true" 
     data-val-number="The field Step must be a number." 
     data-val-required="The Step field is required." 
     id="step" 
     name="step" 
     type="hidden" 
     value="0"> 
    <p> 
     <label for="">1 
     </label> 
    </p> 

Как это возможно?

Недвижимость Step имеет тип Int32 и прирастает каждое действие POST.

EDIT:

@model ***.WebUI.Models.OrderViewModel 
@{ 
    ViewBag.Title = "New order"; 
} 
<h2> 
    New order</h2> 
@using (Html.BeginForm()) 
{ 
    @Html.Hidden("step", Model.Step) 
    <p>@Html.Label(Model.Step.ToString())</p> 
    <div> 
    //other inputs 
    </div> 
} 
+0

Можем ли мы увидеть весь код в этом представлении? Это очень запутанная проблема. – mituw16

+0

Каково фактическое значение 'Model.Step' при отладке? Кроме того, существуют ли атрибуты аннотаций данных, определенные в свойстве? – haim770

+0

Breakpoint @ return View (orderViewModel); <- значение Step равно 1. – ZxCvBnM

ответ

2

Вы не показали вам POST метод, но основанный на «Шаг свойств относится к типу Int32 и увеличивается каждое действие POST.» Я предполагаю, что это выглядит как

public ActionResult Edit(OrderViewModel model) 
{ 
    model.Step = model.Step + 1; 
    return View(model); 
} 

При проводке модели, модели значения добавляются к ModelState (наряду с ошибками ModelState), поэтому в первом посте, значение StepModelState будет 0. Помощники Html используют значения ModelState для привязки (если таковые существуют), поэтому при возврате вида @Html.Hidden("step", Model.Step) связывается со значением 0 (а не с моделями 1). Причина такого поведения объясняется в this answer.

Правильный подход должен следовать шаблону PRG (перенаправляет к методу GET, проходящее параметр, указывающий значение Step и инициализировать новый OrderViewModel), однако вы можете сделать эту работу по очистке ModelState так, что Html Helper будет использовать значение модели.

public ActionResult Edit(OrderViewModel model) 
{ 
    ModelState.Clear(); // clear all model state 
    model.Step = model.Step + 1; 
    return View(); 
} 

Однако, используйте это с осторожностью. ModelState.Clear() удаляет все ошибки.

+0

Спасибо за объяснение и решение! – ZxCvBnM

Смежные вопросы