2013-07-15 51 views
0

我有一個視圖,其中包含下拉列表,並且在選擇的下拉列表項目中加載了部分視圖。當提交表單時,我希望能夠在表單提交時從主視圖和部分視圖中獲取值。 這裏是主視圖在post方法中從部分視圖中檢索值

@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" }); 

     } 

現狀: 當表單被提交,屬性通過局部視圖傳遞的模型的值爲null。我得到其他值,如typename,模塊ID。

我想要什麼: 我也想獲得通過局部視圖傳遞的屬性的值。

回答

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() 

,最後一步是定義一個自定義編輯模板屬性類:~/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 /> 
+0

我仍然得到了性能空值:(這是我在控制器已經做了[HTTPGET]'公衆的ActionResult GetModulePropertyName(字符串moduleTypeValue) {VAR 溫度= _repository.GetModuleKindPropertyNames(moduleTypeValue); 的IList 模型=溫度.Select(item => new Property {Name = item})。ToList(); return PartialView(「GetModulePropertyName」,model); }'和視圖與您所提到的一樣 – Cybercop

+0

您可以粘貼'name ' –

+0

你的意思是由部分視圖生成的隱藏輸入字段名稱? – Cybercop

0

嘗試使用

List<Property> 

在您的局部視圖模型,並從您的視圖通過CreateModule.Properties爲模型

+0

謝謝,我也這麼想。但在主視圖中的腳本所指向的'HttpGet'方法中。我如何改變我的方法?我可以在那裏做什麼,以便我可以將價值傳遞給我的部分觀點,並像我說的那樣使用我的觀點模型? – Cybercop

0

的問題是模型綁定想不出有

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

屬於「名稱」不是您的模型類的屬性。如果您需要綁定到CreateModule.Properties你需要改變局部視圖發出與aproprate名稱文本框,像這樣的:

@model IEnumerable<string> 
@ 
{ 
int i=0; 
} 
    @foreach(var names in Model) 
    { 
     <div class="input-block-level">@Html.TextBox("Properties[" + i + "].Value")</div> 
     <br/> 
    } 
相關問題