2013-07-15 2 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" }); 

     } 

Текущая ситуация: Когда форма Отправленные, свойства значение модели, которая передается через частичный вид, является нулевым. Я получаю другие значения, такие как 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() 

и последним шагом является определение настраиваемого шаблона редактора для класса 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 /> 
+0

я все еще получаю пустое значение свойства :(Это то, что я сделал в контроллере для [HttpGet] 'общественного ActionResult GetModulePropertyName (строка moduleTypeValue) { вара температурных = _repository.GetModuleKindPropertyNames (moduleTypeValue); IList модели = Темп .Select (item => новое свойство {Name = item}). ToList(); возвращает PartialView («GetModulePropertyName», model); } 'и представление точно так, как вы уже упоминали. – Cybercop

+0

Не могли бы вы вставить имя 'из некоторых скрытых полей ввода, которые сгенерированы? –

+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/> 
    } 
Смежные вопросы