2012-05-16 96 views
0

我有麻煩了,請求您的幫助。MVC3部分模型驗證

我有一個簡單的類

public class Test 
{ 
    [Key] 
    public string a { get; set; } 

    [Required] 
    public string c { get;set; } 

    public string b { get; set; } 
} 

我創建了一個簡單的表格,提交新的實體實例和它的作品。 編輯時遇到問題: 編輯表單顯示'a'和'b'屬性。因爲「C」只能在新的實體提交,不得展示(不要問爲什麼),我更新方法:

public ActionResult Edit(Test t) 
{ 
    if (ModelState.IsValid) 
    { 
    //get the m instance 
     UpdateModel(m,//other params); 
     ValidateModel(m); 
    } 
    //saving code 
} 

Obiously ModelState.IsValid永遠是假的(因爲「C」需要」,但它爲空)並且UpdateModel引發異常(出於同樣的原因)。 我怎麼能說MVC3「不驗證這個領域,只有在這個控制器方法?」 顯然,我不會在模型類中寫入未驗證的字段!我只需要更新'b'屬性。 謝謝。

+1

你有沒有想過關於使用FluentValidation,通過這種方式,您可以使用RuleSets,並在控制器內設置針對哪個RuleSet進行驗證。 – Qpirate

+0

我會馬上檢查它。謝謝。 – Vincenzo

回答

2

最簡單的方法是爲此局部視圖創建其他視圖模型。

+0

我想避免這種做法,但無論如何是一個解決方案。謝謝。 – Vincenzo

1

爲該視圖創建另一個視圖模型,並針對該視圖模型而不是實體進行驗證。

0
@{ 
    object htmlAttribute = null; 
    if(Model.Id > 0) 
    { 
     htmlAttribute = new { disabled = "disabled" }; 
    } 
} 

@Html.TextBoxFor(model => model.C, htmlAttributes) 

禁用時,C將不會驗證

+0

看起來很不錯。我會馬上嘗試! – Vincenzo

+0

@Vincenzo做到了嗎?我沒有測試過它 – karaxuna

+0

我簡單地分解了模型,並在方法的參數中獲取需要的屬性作爲單個值。它的工作,但我不喜歡它很多。 – Vincenzo

0

當窗體是在編輯模式下,使該領域的隱藏屬性與您在控制器評估「默認」值。如果您不想在表單上顯示屬性並仍然需要,那麼您不應該使用「ModeState.IsValid」並進行自己的驗證。該屬性的

實施例被隱藏:

控制器

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

    public ActionResult Edit(string id) { 
     return View((string.IsNullOrEmpty(id)) ? new Test { a = "new" } : FakeRepository.Data(id)); 
    } 

    [HttpPost] 
    public ActionResult Edit(Test model) { 
     if (ModelState.IsValid) { 
      if (model.a == "new") { 
       //Create a new record 
      } else { 
       //Update Record 
      } 
      return RedirectToAction("Index"); 
     } 
     return View(model); 
    } 

    public static class FakeRepository { 
     public static Test Data(string a) { 
      return new Test { 
       a = a, 
       b = "B", 
       c = "C" 
      }; 
     } 
    } 

實體

public class Test { 
    [Key] 
    [Display(Name="A Property")] 
    public string a { get; set; } 

    [Required] 
    [Display(Name = "C Property")] 
    public string c { get; set; } 

    [Display(Name = "B Property")] 
    public string b { get; set; } 
} 

查看

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>Test</legend> 

     @Html.HiddenFor(model => model.a)  


     @if (Model.a != "new") { 
      @Html.HiddenFor(model => model.c) 
     } else { 
      <div class="editor-label"> 
       @Html.LabelFor(model => model.c) 
      </div> 
      <div class="editor-field"> 
       @Html.EditorFor(model => model.c) 
       @Html.ValidationMessageFor(model => model.c) 
      </div> 
     }  

     <div class="editor-label"> 
      @Html.LabelFor(model => model.b) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.b) 
      @Html.ValidationMessageFor(model => model.b) 
     </div> 

     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 
} 

現在

... /修改/東西會隱藏 「C」

... /修改/會顯示 「C」