从视图传递@Html.DisplayFor()值到控制器

5

我正在上这些课程:

public class ProductViewModel
{
    public IEnumerable<Product> Products { get; set; }

}

public class Product
{
    public int ArticeNr { get; set; }
    public string Name { get; set; }

}

这是一个视图。
@model ProductsViewModel

@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
<table class="table">

    @foreach (var item in Model.Products) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.ArticleNr)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
        </tr>
    }
</table>

<input type="submit" value="submit" name="submitButton" />
}

如何将Model.Products中的所有值传递给Controller?我希望在foreach循环中发送所有值到控制器。

我的控制器以ProductsViewModel为参数。但是我在model.Products中提交后,值为null。

        public ActionResult Index(ProductsViewModel model) //here, model.Products is always null after post
        {
            //LOGIC
        }

2
DisplayFor() 不会为 postback 创建输入。您需要使用生成 <input><select> 元素的方法,例如 EditorFor()TextBoxFor()HiddenFor() 等。 - user3559349
你没有正确构建循环。你需要 for(int i = 0; i < Model.Projects.Count; i++) { @Html.HiddenFor(m => m.Projects[i].Name) ..。但是你为什么要提交一堆隐藏的输入呢? - user3559349
@StephenMuecke。我想要实现的是将foreach中的所有值回传到控制器,而不是在控制器中从数据库进行新的加载。有没有更简洁的方法?或者重新从数据库加载所有产品项更好? - user3228992
1
从性能角度来看,再次从数据库获取集合通常总是更好的选择,尽管我不确定为什么在保存模型时需要再次获取集合。 - user3559349
1
为了提高性能,我建议您使用AJAX(jquery的$.get()函数)将值传递给一个操作方法,该方法调用数据库根据这些值筛选结果并返回一个可以在视图中更新的部分视图 - 也就是说,您不需要重构整个页面。 - user3559349
显示剩余3条评论
4个回答

1

@Html.DisplayFor仅在视图中显示值。

如果您希望该值在提交时传回控制器,则还需要@Html.HiddenFor。


0
我有一个例子。这是视图在按钮提交时发送回表单值,这些值绑定自另一个控制器操作。

 @using (Html.BeginForm("Add", "Product", FormMethod.Post))
{
    @Html.ActionLink("CheckOut", "Checkout", new { @class = "btn btn-success" })
    foreach (var item in Model)
    {
        <div class="row">
            <div class="col-lg-3">
                <img id="img" src="@Html.DisplayFor(modelItem => item.img)" alt="img" />
            </div>
            <div class="col-lg-3">
                <input type="text" name="name" value="@item.name" border="0" />
                <br />
                <input id="text1" name="quantity" type="number" placeholder="Quantity" class="form-control text-muted" style="width:100px" />
                <br />
                <span>Price(per Kg):&nbsp;&nbsp;</span> &#8377;
                <input type="text" name="price" value="@item.price" border="0" />
                <br />
                <input id="Button1" type="submit" value="ADD" />
            </div>
            <div class="col-lg-6">
            </div>
        </div>
        <hr />
        <br />
    }
}

这是控制器中接收值的操作方法

 public ActionResult Add(string name,int quantity,int price)
    {
        Session["name"] = name;
        Session["quantity"] = quantity;
        Session["price"] = price;
        Session["Total"] = quantity * price;
        return RedirectToAction("UserView");
    }

我认为这会有所帮助。


0

我看到你在foreach循环中没有修改你的值 - 所以你正在将与显示相同的值发送回视图。在这种情况下,保持你的模型类不变,但是更改你的索引视图和主页控制器如下:

视图:

   @model Models.ProductViewModel



   @using (Html.BeginForm("Index", "Home", FormMethod.Post))
   {
    <table class="table">

    @foreach (var item in Model.Products)
    {
        <tr>
            <td>
                @item.ArticleNr
            </td>
            <td>
                @item.Name
            </td>
        </tr>
    }
    </table>

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

控制器:

    [HttpGet]
    public ActionResult Index()
    {           
        return View(new ProductViewModel()); // this model contains products you want to display
    }

    [HttpPost]
    public ActionResult Index(ProductViewModel model)
    {
        // do smth with your model here
        return View();
    } 

我怀疑你的问题是由于你的操作没有带有 [HttpGet] 和 [HttpPost] 属性导致的。


0

在这里,我将描述如何使用示例应用程序在ASP.Net MVC 3中发布集合。发布的基本思想(从视图传递HTML字段值到控制器)是通过将呈现的HTML控件的名称字段与控制器操作方法中的接收参数进行匹配。
ASP.Net MVC - 如何发布集合


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接