0

我有一个包含下拉列表的视图,并且在选择下拉列表项目时我加载了部分视图。当提交表单时,我希望能够在表单提交期间从主视图和部分视图中获取值。这是主视图

@model AdminPortal.Areas.Hardware.Models.CreateModule
@{
    ViewBag.Title = "Create Module";
    Layout = "~/Views/shared/_BootstrapLayout.basic.cshtml";
}

@Html.ValidationSummary(true)


<fieldset class="form-horizontal">
    <legend>Add a Module <small>Create</small></legend>
    @using (Html.BeginForm("CreateModule", "Module", new{id="AddModuleForm"}))
    {
        @Html.ValidationSummary(true)
        <div class ="controls">
            <div class="input-block-level">@Html.TextBoxFor(model => model.ModuleId, new {@placeholder = "ModuleID"})</div>
            <br/>
            <div class ="input-block-level" id="selectedModuleTypeName">@Html.DropDownListFor(model => model.SelectedModuleTypeName, Model.TypeNames,"Select Moduletype", new{id = "ModuleList"})</div>

            <br/>
            <div id="partialDiv"></div>
        </div>
         <div class="form-actions" id="buttons">
        <button type="submit" class="btn btn-primary" id="Submit">Save changes</button>
        @Html.ActionLink("Cancel", "ModuleList", null, new { @class = "btn " })
    </div>

    }

</fieldset>
<div>
    @Html.ActionLink("Back to List", "ModuleList")
</div>
<script>
    $("#buttons").hide();
    $("#ModuleList").on("change", function() {
        var modId = $(this).val();
        $.get('@Url.Action("GetModulePropertyName", "Module")', { moduleTypeValue: modId }, function(result) {
            $("#partialDiv").html(result);
        });
        //uncomment following section to check if the partial view is working properly
        /*.done(function() { alert("done"); })
            .fail(function() { alert("fail"); })
            .always(function() { alert("completed"); });*/

    });
        $("#buttons").show();

</script>

这是部分视图

    @model IEnumerable<string>

    @foreach(var names in Model)
    {
        <div class="input-block-level">@Html.TextBoxFor(m=>names, new{Value="", placeholder=names})</div>
        <br/>
    }

这是我的模型

public class CreateModule
    {
        //Empty form to handle form serialization
        public CreateModule()
        {
        }

        [Required]
        public string ModuleId { get; set; }

        [DataType(DataType.DateTime)]
        public DateTime DateEntered { get; set; }

        [Required]
        public string SelectedModuleTypeName { get; set; }
        public IEnumerable<SelectListItem> TypeNames { get; set; }

        public List<Property> Properties { get; set; }
    }

public class Property
    {
        public string Name { get; set; }
        public string Value { get; set; }
    }

这是主视图中的脚本转发到的方法

[HttpGet]
        public ActionResult GetModulePropertyName(string moduleTypeValue)
        {
            var moduleKindId = _repository.GetModuleKindId(moduleTypeValue);
            var modulePropertyNames = _repository.GetModuleKindPropertyNames(moduleTypeValue);
            return PartialView("GetModulePropertyName",modulePropertyNames);
        }

最后是主视图的httppost方法

[HttpPost]
        public ActionResult CreateModule(CreateModule moduleV)
        {
            var module = new Module
                {
                    ModuleTypeId = Convert.ToInt64(moduleV.SelectedModuleTypeName),
                    ModuleId = moduleV.ModuleId,
                    DateEntered = moduleV.DateEntered,


                };
            if (ModelState.IsValid)
            {
               _repository.AddModule(module);
                Success("Module added successfully!");
                return RedirectToAction("ModuleList", "Module", new {area = "Hardware"});
            }


                Error("Something went wrong!");
                return RedirectToAction("CreateModule", "Module", new { area = "Hardware" });

        }

当前情况: 表单发布时,通过局部视图传递的模型的属性值为空。我得到其他值,如类型名、模块 ID。

我想要什么: 我还想获取通过局部视图传递的属性的值。

4

3 回答 3

1

您在表单中的任何位置都没有该Properties属性的任何输入字段。所以它永远是空的。这很正常。

这是您可以继续进行的方法。首先设置正确的导航属性,以便助手生成相应输入字段的正确名称。

IEnumerable<Property>如果您希望能够正确取回它们,还请确保将模型传递给部分:

[HttpGet]
public ActionResult GetModulePropertyName(string moduleTypeValue)
{
    var moduleKindId = _repository.GetModuleKindId(moduleTypeValue);
    IList<Property> model = ...
    return PartialView("GetModulePropertyName", model.ToList());
}

并在您的部分视图中使用编辑器模板:

@model IList<Property>
@{
    // This indicates the current navigational context to the helpers
    ViewData.TemplateInfo.HtmlFieldPrefix = "Properties";
}

@Html.EditorForModel()

最后一步是为Property类定义一个自定义的编辑器模板:(~/Views/Shared/EditorTemplates/Property.cshtml注意模板的名称和位置很重要)

@model Property
<div class="input-block-level">
    @Html.HiddenFor(m => m.Name)
    @Html.TextBoxFor(m => m.Value, new { placeholder = Model.Name })
</div>
<br />
于 2013-07-15T13:06:18.937 回答
0

尝试使用

List<Property> 

作为局部视图中的模型,并从视图中将 CreateModule.Properties 作为模型传递

于 2013-07-15T12:58:15.527 回答
0

问题是模型活页夹无法弄清楚

@Html.TextBoxFor(m=>names, new{Value="", placeholder=names})

属于“名称”不是模型类的属性。如果您需要绑定到 CreateModule.Properties,您需要更改局部视图以发出具有适当名称的文本框,如下所示:

 @model IEnumerable<string>
@
{
 int i=0;
}
    @foreach(var names in Model)
    {
        <div class="input-block-level">@Html.TextBox("Properties[" + i + "].Value")</div>
        <br/>
    }
于 2013-07-15T13:04:47.800 回答