【问题标题】:Pass data from partial view to controller action将数据从局部视图传递到控制器操作
【发布时间】:2012-07-18 08:33:03
【问题描述】:

我有一个强类型的局部视图,它以列表格式显示输出。我想从数据库的部分视图中插入数据。我正在努力遍历部分视图中的行并将它们发送到控制器操作以插入数据库。这是我到目前为止所拥有的

部分:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Student.Models.vwStudent>>" %>

<table>
        <tr>
            <th>
                Student ID
            </th>           
            <th>
                Past Due Amount
            </th>
            <th>
                Past Due Days
            </th>            
        </tr>

        <% if (Model != null)
           foreach (var item in Model) { %>

        <tr>
            <td>
                <%=Html.TextBox("StudentID",item.StudentID) %>
            </td>

            <td>
                <%=Html.TextBox("PastDueAmount",item.PastDueAmount) %>
            </td>
            <td>
                <%=Html.TextBox("PastDueDays",item.PastDueDays) %>
            </td>            
        </tr>

    <% } %>

    </table>

这是我在 master 中访问以上部分的方式:

<div>
<% using(Html.BeginForm("SaveStudentInvoice", "StudentInvoice")) %>
<% { %>
<div>
<% Html.RenderPartial("DisplayStudentInvoiceList"); %>
</div>
<% } %>
<br/>
<input type="button" id="Submit" name="Submit" value="Submit" />
</div>

控制器:

[HttpPost()]
public ActionResult SaveStudentInvoice(IEnumerable<Student.Models.vwStudent> students)
{
    DataContext db = new DataContext();

foreach(Student.Models.vwStudent student in students){

        Invoice Inv = new Invoice();
        {
            Inv.StudentID= student.StudentID;
            Inv.PastDueAmount= student.PastDueAmount;   
            Inv.PastDueDays= student.PastDueDays;                 
        };

        db.Invoices.InsertOnSubmit(Inv);
}
        db.SubmitChanges();

        return View();

}

在局部视图中,列出了不止一名学生(2,3,4.. 行)。当我点击“保存”按钮时,我只能保存 Partial(第一行)中列出的第一个学生,如何循环访问部分列出的剩余学生以保存他们?

提前致谢。

【问题讨论】:

    标签: c# asp.net-mvc partial-views html-helper


    【解决方案1】:

    你的绑定错误,你可以从这个示例绑定开始,如果有任何错字,对不起,我是在编辑器本身输入的。

    更新:

    你的部分:

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<SaveStudentInvoice.Models.vwStudent>>" %>
    
    <table>
            <tr>
                <th>
                    Student ID
                </th>           
                <th>
                    Past Due Amount
                </th>
                <th>
                    Past Due Days
                </th>            
            </tr>
    
            <% if (Model != null)
      for (int i = 0; i < Model.Count(); i++) { %>
            <tr>
                <td>
                    <%=Html.TextBoxFor(m=>m.ToList()[i].StudentID) %>
                </td>
    
                <td>
                    <%=Html.TextBoxFor(m=>m.ToList().ToList()[i].PastDueAmount) %>
                </td>
                <td>
                    <%=Html.TextBoxFor(m=>m.ToList()[i].PastDueDays) %>
                </td>            
            </tr>
    
        <% } %>
    
        </table>
    

    你的主视图:

    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
       <div>
    <% using(Html.BeginForm("Index","Home")) %>
    <% { %>
    <div>
    <% Html.RenderPartial("Partial",Model); %>
    </div>
    <br/>
    <input type="submit" id="Submit" name="Submit" value="Submit" />
    <% } %>
    
    </div>
    </asp:Content>
    

    你的控制器:

    public ActionResult Index()
            {
                List<vwStudent> students = new List<vwStudent>();
                students.Add(new vwStudent() { PastDueAmount = 100, PastDueDays = "None", StudentID = "ooooo" });
                students.Add(new vwStudent() { PastDueAmount = 102, PastDueDays = "No", StudentID = "Sollina" });
                return View(students);
    
            }
            [HttpPost]
            public ActionResult Index(List<vwStudent> studentModel)
            {
    
                return View(studentModel);
    
            }
    

    【讨论】:

    • 它仍在将 null 传递给我的控制器操作。我已经更新了上面的代码
    • @user793468 检查这个新更新,它建立在我的系统上,应该适合你。
    【解决方案2】:

    尝试为 MVC 绑定将识别为对象集合的输入命名:

           int index = 0;
           foreach (var item in Model) { %>
            <td>
                <%=Html.TextBox(string.Format("Entry[{0}].StudentID", index),
                                item.StudentID) %>
            </td>
            ...
        <% 
               i++;
           } %>
    

    然后您可以使用 IEnumerable&lt;Student.Models.vwStudent&gt; 作为您的模型类型,如 tsegay 所述。

    【讨论】:

    • 当我单击提交时,它仍然将 null 传递给我的控制器操作。我已经更新了上面的代码
    • @user793468:您似乎没有按照我在更新后的代码中建议的更改。
    【解决方案3】:

    您需要将模型绑定到集合。目前它只是绑定到单个值。

    查看:http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-25
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 2020-10-28
      相关资源
      最近更新 更多