2012-02-13 46 views
2

我正在使用IQueryable<Book>作爲我的CheckIn視圖的模型。ASP .Net MVC 3 - 表單,批量編輯,強類型視圖和驗證

我有興趣讓用戶同時檢查多本書。這就是我爲模型使用IQueryable的原因。

請糾正我,如果我錯了,但據我所知,在這種情況下,@Html.EditorFor將創建多個具有相同元素ID的元素。不是嗎?

什麼是創建可查詢集合中所有圖書的編輯器表單的最佳方法,並確保客戶端驗證能夠繼續工作?

+0

'Html.EditorFor(M => M [I] .ID)'將顯示模型的'的Id值[I] .Id'。如果您的模型具有重複的ID,您的表單也會重複。 – jrummell 2012-02-13 18:06:25

+0

@jrummell:是的使用我的表單的元素將有重複的Id。但那麼客戶端驗證如何工作呢? – Moon 2012-02-13 19:28:50

+0

好吧,要開始,你應該確保你有獨特的ID。除此之外,你是否有特定的錯誤? – jrummell 2012-02-13 19:30:46

回答

2

請糾正我,如果我錯了,但據我知道這個 情況下,@ Html.EditorFor將創建一個 相同元素的id多個元素。不是嗎?

呃,沒有。

型號:

public class Book 
{ 
    public int Id { get; set; } 
    public bool Selected { get; set; } 
} 

控制器:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new[] 
     { 
      new Book { Id = 1, Selected = false }, 
      new Book { Id = 2, Selected = true }, 
      new Book { Id = 3, Selected = false }, 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(IEnumerable<Book> model) 
    { 
     return View(model); 
    } 
} 

檢視:

@model IEnumerable<Book> 
@using (Html.BeginForm()) 
{ 
    <table> 
     <thead> 
      <tr> 
       <th>Id</th> 
       <th>Selected</th> 
      </tr> 
     </thead> 
     <tbody> 
      @Html.EditorForModel() 
     </tbody> 
    </table> 
    <button type="submit">OK</button> 
} 

編輯器模板(~/Views/Shared/EditorTemplates/Book.cshtml):

@model Book 
<tr> 
    <td>@Html.EditorFor(x => x.Id)</td> 
    <td>@Html.CheckBoxFor(x => x.Selected)</td> 
</tr> 

生成的標記:

<form action="/" method="post">  
    <table> 
     <thead> 
      <tr> 
       <th>Id</th> 
       <th>Selected</th> 
      </tr> 
     </thead> 
     <tbody> 
      <tr> 
       <td> 
        <input class="text-box single-line" data-val="true" data-val-number="Le champ Id doit &amp;#234;tre un nombre." data-val-required="The Id field is required." name="[0].Id" type="text" value="1" /> 
       </td> 
       <td> 
        <input data-val="true" data-val-required="The Selected field is required." name="[0].Selected" type="checkbox" value="true" /> 
        <input name="[0].Selected" type="hidden" value="false" /> 
       </td> 
      </tr> 
      <tr> 
       <td> 
        <input class="text-box single-line" data-val="true" data-val-number="Le champ Id doit &amp;#234;tre un nombre." data-val-required="The Id field is required." name="[1].Id" type="text" value="2" /> 
       </td> 
       <td> 
        <input checked="checked" data-val="true" data-val-required="The Selected field is required." name="[1].Selected" type="checkbox" value="true" /> 
        <input name="[1].Selected" type="hidden" value="false" /> 
       </td> 
      </tr> 
      <tr> 
       <td> 
        <input class="text-box single-line" data-val="true" data-val-number="Le champ Id doit &amp;#234;tre un nombre." data-val-required="The Id field is required." name="[2].Id" type="text" value="3" /> 
       </td> 
       <td> 
        <input data-val="true" data-val-required="The Selected field is required." name="[2].Selected" type="checkbox" value="true" /> 
        <input name="[2].Selected" type="hidden" value="false" /> 
       </td> 
      </tr> 
     </tbody> 
    </table> 

    <button type="submit">OK</button> 
</form>