Значение, использующее расширение HTML, отличается от того, что должно быть, если две модели имеют свойство с одинаковым именем

вот мой сценарий.

  1. созданы две модели, которые имеют общее имя свойства

    public class SimpleModel1
    {
    // Some Properties
    
    public string Property1 { get; set; }
    
    }
    
    public class SimpleModel2
    {
    // Some Properties
    
    public string Property1 { get; set; } // Same name as Property1 in SimpleModel1
    
    }
    
  2. используется SimpleModel1 в действии (например, Index), которое возвращает представление, которое выглядит следующим образом

    @model MvcApplication2.Models.SimpleModel1
    
    @{
    ViewBag.Title = "Home Page";
    }
    
    @using (Html.BeginForm("Test", "Home", FormMethod.Post))
    {
      <label>Enter something here</label>
       @Html.TextBoxFor(m => m.Property1)
       <button type="submit">Submit</button>
    }
    
  3. отправлено значение в тестовое действие, которое принимает SimpleModel1 в качестве параметра, выполняет некоторую работу и возвращает представление, которое принимает SimpleModel2

    public ActionResult Test(SimpleModel1 model)
    {
        SimpleModel2 newModel = new SimpleModel2();
    
        // Do Something
    
        newModel.Property1 = "Something different than model's Property1";
    
        return View(newModel);
    }
    
  4. Теста.cshtml по (вид, возвращаемый действием теста), как показано ниже:

    @model MvcApplication2.Models.SimpleModel2
    
    @{
        ViewBag.Title = "Test";
    }
    
    <h2>Test</h2>
    
     @* Model Propery without using HTML extension*@
     @Model.Property1
    
     @* Model property using HTML extension (Incorrect) *@
    
     @Html.TextBoxFor(m => m.Property1)
     @Html.HiddenFor(m => m.Property1)
     @Html.TextAreaFor(m => m.Property1)
    
      @* Correct Value *@
     <input value="@Model.Property1" />
    

Я ожидаю, что все значения Property1 будут "чем-то отличным от Property1 модели", как установлено в тестовом действии. Но оказывается, что те, которые используют расширение Html (Html.TextBoxFor, HTML-Код.HiddenFor и т. д.) имеют значение Property1, которое было опубликовано для тестирования действия. Например, если я опубликую "какой сюрприз" (свойство 1 SimpleModel1) для проверки действия, значение свойства 1 SimpleModel2 также "Какой сюрприз", независимо от того, что я установил.

Я понятия не имею, что происходит. Похоже на жука. Кто-нибудь знает?

1 ответов


вы увидите это поведение при выполнении в должности потому что разнесенные данные сохраняются в ModelState. Значение для свойства Property1 будет равно значению, которое было учтено для этого свойства. Чтобы увидеть новое значение, вам нужно включить эту строку кода в тест ActionResult:

ModelState.Clear();

как правило, просто не забудьте включить эту строку, если вы проводите данные, модифицируя их и пытаясь увидеть измененные данные в возвращаемом представлении.