razor – 使用HTML扩展的值与两个模型具有相同名称的属性时的值不同

前端之家收集整理的这篇文章主要介绍了razor – 使用HTML扩展的值与两个模型具有相同名称的属性时的值不同前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我的情景.

>创建了两个具有公共属性名称的模型

  1. public class SimpleModel1
  2. {
  3. // Some Properties
  4.  
  5. public string Property1 { get; set; }
  6.  
  7. }
  8.  
  9. public class SimpleModel2
  10. {
  11. // Some Properties
  12.  
  13. public string Property1 { get; set; } // Same name as Property1 in SimpleModel1
  14.  
  15. }

>在Action(例如Index)中使用SimpleModel1,返回看起来像这样的视图

  1. @model MvcApplication2.Models.SimpleModel1
  2.  
  3. @{
  4. ViewBag.Title = "Home Page";
  5. }
  6.  
  7. @using (Html.BeginForm("Test","Home",FormMethod.Post))
  8. {
  9. <label>Enter something here</label>
  10. @Html.TextBoxFor(m => m.Property1)
  11. <button type="submit">Submit</button>
  12. }

>将值提交给以SimpleModel1作为参数的Test操作,做一些工作,并返回一个接受SimpleModel2的视图

  1. public ActionResult Test(SimpleModel1 model)
  2. {
  3. SimpleModel2 newModel = new SimpleModel2();
  4.  
  5. // Do Something
  6.  
  7. newModel.Property1 = "Something different than model's Property1";
  8.  
  9. return View(newModel);
  10. }

> Test.cshtml(Test动作返回的视图)如下:

  1. @model MvcApplication2.Models.SimpleModel2
  2.  
  3. @{
  4. ViewBag.Title = "Test";
  5. }
  6.  
  7. <h2>Test</h2>
  8.  
  9. @* Model Propery without using HTML extension*@
  10. @Model.Property1
  11.  
  12. @* Model property using HTML extension (Incorrect) *@
  13.  
  14. @Html.TextBoxFor(m => m.Property1)
  15. @Html.HiddenFor(m => m.Property1)
  16. @Html.TextAreaFor(m => m.Property1)
  17.  
  18. @* Correct Value *@
  19. <input value="@Model.Property1" />

我期望的是,Property1的所有值都将是“与模型的Property1不同的东西”,如Test Action中所设置的那样.但事实证明,使用Html扩展(Html.TextBoxFor,Html.HiddenFor等)的那些具有发布到Test Action的Property1值.例如,如果我将“What a surprise”(SimpleModel1的Property1)发布到Test Action,那么无论我将它设置为什么,SimpleModel2的Property1的值也是“多么令人惊讶”.

我不知道发生了什么事.对我来说看起来像个错误.有谁有想法吗?

解决方法

执行POST时会看到此行为,因为已发布的数据在ModelState中保留. Property1的值将是为此属性发布的值.
要查看新值,您需要在ActionResult测试中包含以下代码行:
  1. ModelState.Clear();

作为一般规则,只需记住包含此行,以防您发布数据,修改数据并尝试在返回的视图上查看已修改的数据.

猜你在找的HTML相关文章