2017-07-15 15 views
0

私はオブジェクトのリストをビューに渡して、ユーザーが単一のオブジェクトのプロパティを更新できるようにします。モデルのIDは、モデルのリストを編集するときに、ASP MVCのビューからアクションに正しく渡されません。

これは取得アクションです。記事のリストをここに渡しています。

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) 
    { 
    } 

私は1,2,3のIDを持つ3つの記事を渡しています。 しかし、どの記事を更新して投稿しても、IDは1として返されます。 タイトルが正しく返されます。

+0

これは本当に意味がありませんあなたは私がクエリ文字列純粋なMVCソリューション?:

ビューを研究したい場合は、私を聞かせてくださいすることができます。一度に1つのフォームしか送信できないので、なぜ複数のフォームを作成しているのですか?また、あなたのモデルに関係しない 'name'属性を生成します。 –

+0

@StephenMuecke私は、ユーザが項目のリストから1つの項目を一度に更新できるようにしています。各項目には更新ボタンがあります。だからこそ、私は各項目ごとに1つのフォームを作成しています。 –

+0

これは間違ったアプローチであり、ひどいUIです(ユーザーが2つのテキストボックスに値を入力し、両方が保存されることを考えてサブミットボタンを押すと、ModelStateが無効な場合はビューを返すことができません) –

答えて

0

これはうまく動作し、各ボタンにIDが必要なmvcのみのソリューションより優れています。

@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); 
    } 
関連する問題