【问题标题】:Sending list of objects from view to action将对象列表从视图发送到操作
【发布时间】:2018-11-29 13:07:55
【问题描述】:

我尝试了所有解决方案,但我的列表仍然为空。

你能指出我正确的方向吗,我真的不知道有什么问题...... 查看:

@using (Html.BeginForm("EditProfile", "User", FormMethod.Post, new { @class = "form form-horizontal" }))
{
    <div class="form-actions pb-0" />
    for (int i = 0; i < Model.UserAddress.Count; ++i)
    {
        <input id="btc-limit-buy-total" hidden type="text" class="form-control" value="@Model.UserAddress[i].AddressId" name="ProfileViewModel.UserAddress[@i].AddressId">
        <div class="form-group row">
            <label class="col-md-3 col-form-label" for="btc-limit-buy-total">Shipping address:</label>
            <div class="col-md-9">
                <input id="btc-limit-buy-total" type="text" @(Model.EditMode ? "" : "disabled") value="@Model.UserAddress[i].AddressLine1@(Model.UserAddress[i].AddressLine2 != null ? $", {Model.UserAddress[i].AddressLine2}" : "")" class="form-control" name="ProfileViewModel.UserAddress[@i].AddressLine1">
            </div>
        </div>
        <div class="form-group row">
            <label class="col-md-3 col-form-label" for="btc-limit-buy-total">City:</label>
            <div class="col-md-9">
                <input id="btc-limit-buy-total" type="text" @(Model.EditMode ? "" : "disabled") value="@Model.UserAddress[i].City" class="form-control" name="ProfileViewModel.UserAddress[@i].City">
            </div>
        </div>
        <div class="form-group row" @(Model.UserAddress[i].StateProvinceRegion != null ? "" : "hidden")>
            <label class="col-md-3 col-form-label" for="btc-limit-buy-total">State:</label>
            <div class="col-md-9">
                <input id="btc-limit-buy-total" type="text" @(Model.EditMode ? "" : "disabled") value="@Model.UserAddress[i].StateProvinceRegion" class="form-control" name="ProfileViewModel.UserAddress[@i].StateProvinceRegion">
            </div>
        </div>
        <div class="form-group row">
            <label class="col-md-3 col-form-label" for="btc-limit-buy-total">Country:</label>
            <div class="col-md-9">
                <input id="btc-limit-buy-total" type="text" @(Model.EditMode ? "" : "disabled") value="@Model.UserAddress[i].Country" class="form-control" name="ProfileViewModel.UserAddress[@i].Country">
            </div>
        </div>
        <div class="form-group row" @(Model.UserAddress[i].Zip != null ? "" : "hidden")>
            <label class="col-md-3 col-form-label" for="btc-limit-buy-total">Postal code:</label>
            <div class="col-md-9">
                <input id="btc-limit-buy-total" type="text" @(Model.EditMode ? "" : "disabled") value="@Model.UserAddress[i].Zip" class="form-control" name="ProfileViewModel.UserAddress[@i].Zip">
            </div>
        </div>
        <div class="form-group row" @(Model.UserAddress[i].DeliveryInstructions != null ? "" : "hidden")>
            <label class="col-md-3 col-form-label" for="btc-limit-buy-total">Additional info:</label>
            <div class="col-md-9">
                <input id="btc-limit-buy-total" type="text" @(Model.EditMode ? "" : "disabled") value="@Model.UserAddress[i].DeliveryInstructions" class="form-control" name="ProfileViewModel.UserAddress[@i].DeliveryInstructions">
            </div>
        </div>
        <div class="form-group row">
            <label class="col-md-3 col-form-label" for="btc-limit-buy-total">Phone number:</label>
            <div class="col-md-9">
                <input id="btc-limit-buy-total" type="text" @(Model.EditMode ? "" : "disabled") value="@Model.UserAddress[i].PhoneNumber" class="form-control" name="ProfileViewModel.UserAddress[@i].PhoneNumber">
            </div>
        </div>
        <div class="form-actions pb-0" />
    }
}
<input type="submit" value="Edit profile" class="btn round btn-success btn-block btn-glow" />

我阅读了有关将“名称”属性发布到正确值的信息,并且我在使用和不使用 ViewModel 前缀的情况下都这样做了,但列表仍然为空。另外,我读到你不能使用foreach,所以我正在使用for。 控制器:

[HttpPost]
        public ActionResult EditProfile(List<UserAddress> userAddresses)
        {
            var model = PopulateProfileViewModel();
            model.EditMode = true;

            if (!ModelState.IsValid)
            {
                return View("Profile");
            }

            //model.UserAddress = userAddresses;
            //TODO update db

            return View("Profile", model);
        }

编辑:

用户地址类:

public class UserAddress
    {
        public short AddressId { get; set; }
        public string FullName { get; set; }
        public string AddressLine1 { get; set; }
        public string AddressLine2 { get; set; }
        public string City { get; set; }
        public string Country { get; set; }
        public string StateProvinceRegion { get; set; }
        public string Zip { get; set; }
        public string PhoneNumber { get; set; }
        public string DeliveryInstructions { get; set; }
        public bool Active { get; set; }
    }

【问题讨论】:

  • 把你的名字改成name="userAddresses[x].SomeProperty"。您不需要将模型的名称放在名称属性的前面,除非您将模型传递回视图。否则,name 属性应与 Controller 中相应的参数名称匹配
  • 您必须使用IEnumerablearray[] 而不是List
  • @Serlok 你能发布你的UserAddress 课程吗?另外,你为什么不使用HTML helpers 作为表单输入,比如@Html.TextBoxFor 等?
  • @Serlok 我想指出的另一件事是,元素的id 属性应该始终是唯一的,您有多个输入具有相同的id&lt;input id="btc-limit-buy-total",不是说这将修复您的表单提交,但您应该养成使用唯一 id 值的习惯
  • 我让它在一个测试项目中工作。我更改了您的控制器方法以接受包含 UserAddress 对象列表的类型的模型,然后将所有名称更改为控制器中的参数名称 .ListName[x].PropertyName

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


【解决方案1】:

我让它在一个测试项目中工作。我将您的控制器方法更改为接受包含UserAddress 对象列表的类型的model,然后将所有names 更改为parameter name in controller .ListName[x].PropertyName

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    相关资源
    最近更新 更多