2017-07-15 24 views
0

我將對象列表傳遞給視圖並允許用戶更新單個對象的屬性。在編輯模型列表時,模型的Id不會從視圖正確傳遞到動作中視圖

這是獲取操作。我將文章列表傳遞給此處的視圖。

public ActionResult EditArticleList(int id) 
    { 
     ArticleList articleList = unitOfWork.ArticleListRepository.GetById(id); 
     IEnumerable<Article> Articles = articleList.Articles; 

     return View(Articles); 
    } 

這是視圖。

@model IEnumerable<Domain.Entities.Article> 

@{ 
    Layout = null; 
} 

<!DOCTYPE html> 

<html> 
<head> 
    <meta name="viewport" content="width=device-width" /> 
    <title>EditArticleList</title> 
</head> 
<body> 

@for (int i = 0; i < Model.Count(); i++) 
{ 
    using (Html.BeginForm("EditArticleList", "AdminArticleList", FormMethod.Post)) 
    { 
     @Html.AntiForgeryToken() 
     @Html.EditorFor(model => Model.ToList()[i].Title, null, "Title") 
     @Html.HiddenFor(model => Model.ToList()[i].Id) 

    <input type="submit" /> 
    <br /> 
    } 
}  

這是後採取行動。

public ActionResult EditArticleList(Article art) 
    { 
    } 

我正在傳遞3篇文章,其中Ids爲1,2,3。 但無論哪篇文章我更新和發佈,ID返回爲1. 標題正確返回。

+0

這真的是沒有意義的,如果你要我研究一個查詢字符串純MVC解決方案?:

視圖可以請你讓我。你只能一次提交一份表格,所以你爲什麼要創建多個表格。並且您的生成'name'屬性與您的模型無關。 –

+0

@StephenMuecke我允許用戶從項目列表中一次更新一個項目。每個項目都有一個更新按鈕。這就是爲什麼我要爲每個項目創建一個表單。 –

+0

這是錯誤的方法,並且是一個可怕的用戶界面(如果用戶在兩個文本框中輸入值並點擊提交按鈕,認爲兩者都將被保存,並且如果'ModelState'無效,則無法返回視圖 –

回答

0

這是有效的,並且比僅有mvc的解決方案更好,這需要每個按鈕都有一個id。

@model IEnumerable<Testy20161006.Controllers.Article> 
@using Testy20161006.Controllers 
@{ 
    Layout = null; 
} 

<!DOCTYPE html> 

<html> 
<head> 
    <meta name="viewport" content="width=device-width" /> 
    <title>EditArticleList</title> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
    <script type="text/javascript"> 
     function SubmitTheForm(theId) { 
      $("#theId").val(theId); 
      $("#formName").submit(); 
     } 
    </script> 
</head> 
<body> 
    @Html.AntiForgeryToken() 
    @*USE YOUR own controller below*@ 
    @using (Html.BeginForm("EditArticleList", "Home", FormMethod.Post, new { id = "formName" })) 
    { 
     <input type="hidden" id="theId" name="theId" /> 
     <table> 
      @foreach (Article item in Model) 
      { 
       <tr> 
        <td></td> 
        <td> 
         @Html.EditorFor(model => item.Title, null, "Title") 
        </td> 
        <td> 
         <input type="button" onclick="SubmitTheForm('@item.Id')" value="Select" /> 
        </td> 
       </tr> 
      } 
     </table> 
     <br /> 
    } 
</body> 
</html> 

控制器/視圖模型:

//your code might be slightly different, but if you look at the view you can solve your issue 
public class Article 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
} 

public class ArticleList 
{ 
    public IList<Article> Articles { get; set; } 
} 

namespace unitOfWork 
{ 
    public static class ArticleListRepository 
    { 
     public static ArticleList GetById(int id) 
     { 
      var article1 = new Article { Id = 1, Title = "article1" }; 
      var article2 = new Article { Id = 2, Title = "article2" }; 
      var article3 = new Article { Id = 3, Title = "article3" }; 
      ArticleList articleList = new ArticleList(); 
      articleList.Articles = new List<Article>(); 
      articleList.Articles.Add(article1); 
      articleList.Articles.Add(article2); 
      articleList.Articles.Add(article3); 
      return articleList; 
     } 
    } 
} 

public class HomeController : Controller 
{ 
    [HttpPost] 
    public ActionResult EditArticleList(int theId, Article art) 
    { 
     //put breakpoint here to see the id returned. 
     return View(art); 
    } 

    public ActionResult EditArticleList(int? id) 
    { 
     ArticleList articleList = unitOfWork.ArticleListRepository.GetById(5); //hard coding for demo 
     IEnumerable<Article> Articles = articleList.Articles; 

     return View(Articles); 
    }