【问题标题】:Fill in form based on dropdown selection (MVC 4)根据下拉选择填写表格(MVC 4)
【发布时间】:2013-01-04 19:00:46
【问题描述】:

我正在使用 asp.net mvc 4 有没有办法根据用户的选择更新表单?

(在这种情况下,如果从下拉列表中选择了某些内容,我想填写地址字段,否则需要输入新地址)

我的模型: 公共类 NewCompanyModel {

    [Required]
    public string CompanyName { get; set; }
    public bool IsSameDayRequired { get; set; }

    public int AddressID { get; set; }
    public Address RegisterOfficeAddress { get; set; }
}

查看:

@model ViewModels.NewCompanyModel


@using (Html.BeginForm(null, null, FormMethod.Post, new { name = "frm", id = "frm" }))
{
@Html.ValidationSummary(true)

<fieldset id="test">
    <legend>Company</legend>


        <h2>Register office address</h2>

        <div class="editor-label">
            @Html.LabelFor(model => model.AddressID)
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.AddressID, (IList<SelectListItem>)ViewBag.Addresses, new {id = "address", onchange = "window.location.href='/wizard/Address?value=' + this.value;" })
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.RegisterOfficeAddress.BuildingNameOrNumber)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.RegisterOfficeAddress.BuildingNameOrNumber)
            @Html.ValidationMessageFor(model => model.RegisterOfficeAddress.BuildingNameOrNumber)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.RegisterOfficeAddress.StreetName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.RegisterOfficeAddress.StreetName)
            @Html.ValidationMessageFor(model => model.RegisterOfficeAddress.StreetName)
        </div>

和控制器:

 public ActionResult Address(string value)
    {
      //get the address from db and somehow update the view
    }

问题是如何更新“model.RegisterOfficeAddress.StreetName”等 只是为了说明这只是表单的一部分,所以我还不能提交。

非常感谢

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    感谢您的帮助;我决定采取不同的方法: 在下拉更改时,我提交表单:

    <div class="editor-label">
            @Html.LabelFor(model => model.ServiceAddress.AddressID)
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.ServiceAddress.AddressID, (IEnumerable<SelectListItem>)ViewBag.Addresses, new { onchange = "this.form.submit();" })
            @Html.ValidationMessageFor(model => model.ServiceAddress.AddressID)
        </div>
    

    然后在控制器中:

      [HttpPost]
            public ActionResult NewDirector(NewDirectorVM vm, string value)
            {
                ModelState.Clear();
                if (vm.ServiceAddress.AddressID > 0)
                {
                   //Updates the properties of the viewModel
                   vm.ServiceAddress = _Repository.GetAddress(vm.ServiceAddress.AddressID);
                }
       return View("NewDirector", vm);
    }
    

    请注意ModelState.Clear();,它实际上允许从控制器更新视图(否则控制器对 viewModel 所做的所有更改都将被视图中的值覆盖)。

    【讨论】:

      【解决方案2】:

      这种情况下的常用方法是通过 javascript 更新其他字段:

      $('#@Html.IdFor(model => model.AddressID)').on('change',function(){
        $.get(...,function(data){
          $('#@Html.IdFor(model => model.RegisterOfficeAddress.BuildingNameOrNumber)').val(data)
        })
      })
      

      【讨论】:

      • 没有别的办法了吗?我来自silverlight背景,两种方式绑定和属性更改事件,你提出的似乎并不干净......
      • 另一种方法是用 $.get() 结果覆盖 html 的一部分。 RegisterOfficeAddress 字段将由部分视图呈现,并将被 $.get() 响应覆盖。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      • 2015-07-08
      • 2019-07-24
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      相关资源
      最近更新 更多