2013-07-06 1 views
0

Главный контроллерКаков правильный способ отправки данных из родительской формы с частичным представлением MVC 4?

public class TestPartialController : Controller 
{ 
    // 
    // GET: /TestPartial/ 

    public ActionResult Index() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Index(Main model) 
    { 
     HttpContext.Items.Add("MainModel", model); 
     return View(); 

    } 

    public ActionResult PartialA() 
    { 
     return PartialView(); 
    } 


    [HttpPost] 
    public ActionResult PartialA(PartialA a) 
    { 
     if (HttpContext.Items["MainModel"] != null) 
     { 
      Main model =(Main) HttpContext.Items["MainModel"]; 
      model.PA = a; 
     } 
     return PartialView(); 

    } 

    public ActionResult PartialB() 
    { 
     return PartialView(); 
    } 

    [HttpPost] 
    public ActionResult PartialB(PartialB b) 
    { 
     if (HttpContext.Items["MainModel"] != null) 
     { 
      Main model = (Main)HttpContext.Items["MainModel"]; 
      model.PB = b; 
     } 
     SubmitDatatoDB(); 
     return PartialView(); 
    } 

    public void SubmitDatatoDB() 
    { 
     if (HttpContext.Items["MainModel"] != null) 
     { 
      Main model = (Main)HttpContext.Items["MainModel"]; 
      //SubmitDatatoDB 
     } 
    } 

} 

Модели: -

namespace TestingMVC4.Models 
{ 
public class Main 
{ 
    public string Main1 { get; set; } 
    public string Main2 { get; set; } 
    public virtual PartialA PA { get; set; } 
    public virtual PartialB PB { get; set; } 
} 

public class PartialA 
{ 
    public string UserName { get; set; } 
    public string UserID { get; set; } 
} 

public class PartialB 
{ 
    public string UserNameB { get; set; } 
    public string UserIDB { get; set; } 
} 
} 

Вид: -

@model TestingMVC4.Models.Main 

@{ 
ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 

<fieldset> 
    <legend>Main</legend> 

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

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

    <div> 
     @Html.Action("PartialA","TestPartial") 
    </div> 
    <div> 
     @Html.Action("PartialB","TestPartial") 
    </div> 

    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 
} 

@model TestingMVC4.Models.PartialA 
@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 

<fieldset> 
    <legend>PartialA</legend> 

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

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


</fieldset> 
} 

Mine Вопрос если это так, то индекс HttpPost основного зрения будет стрелять первым , чем в соответствии с частичным представлением A и частичным представлением B. В этом случае мне нужно сохранить данные в HttpContext.Items и вызвать отправку в базу данных в последнем частичном представлении B.

Что я хочу, это огонь Частичный вид A и B, и сохраните данные в модели Main View и вызовите функцию SubmitDatatoDB в POST-действии Main View.

ответ

2

Рисунок из 2 метода для достижения шахтных целей

1) прохождение основной модели для каждого частичного вида, образец частичного вида: -

@model TestingMVC4.Models.Main 
//@model TestingMVC4.Models.PartialA 
<fieldset> 
    <legend>PartialA</legend> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.PA.UserName) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.PA.UserName) 
     @Html.ValidationMessageFor(model => model.PA.UserName) 
    </div> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.PA.UserID) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.PA.UserID) 
     @Html.ValidationMessageFor(model => model.PA.UserID) 
    </div> 
</fieldset> 

недостатки этого метода является частичным вид плотно к другому виду.

2) преобразовать все частичный вид стать шаблоны помощникам: - справка с http://lostechies.com/jimmybogard/2011/09/07/building-forms-for-deep-view-model-graphs-in-asp-net-mvc/

этот второй метод является повторно в состоянии, так как он использовал его собственную модель связывания, а не модели из родителей, например: -

@model TestingMVC4.Models.ProductEditModel 
@{ 
    ViewBag.Title = "Index"; 
} 
<p> 
    @Html.LabelFor(m => m.Name) 
    @Html.TextBoxFor(m => m.Name) 
</p> 
@Html.EditorFor(m => m.Price)  


@model TestingMVC4.Models.PriceEditModel 
<p> 
    @Html.LabelFor(m => m.Currency) 
    @Html.TextBoxFor(m => m.Currency) 
</p> 
<p> 
    @Html.LabelFor(m => m.Value) 
    @Html.TextBoxFor(m => m.Value) 
</p> 
+0

Спасибо человек. Это действительно помогло. :) –

1

Вы должны изменить привязки, чтобы получить PartialModelA для заполнения MainModel и убедитесь, что Частичный вид А размещение обратно и действие на главном контроллере

Что-то вроде этого:

@using (Html.BeginForm("MainAction", "MainController")) { 

<fieldset> 
    <legend>PartialA</legend> 

    <div class="editor-label"> 
     @Html.Label("UserName", model.UserName) 
    </div> 
    <input type="submit" /> 

</fieldset> 
} 

Обратите внимание на действие и контроллер добавлен в форму и смену LabelFor для использования только метки.

+0

Благодарю forseta, но я хочу, чтобы каждый вид и частичный вид выполняли свой собственный обратный вызов, чтобы сделать собственную привязку к модели, и вся привязка к модели добавляет в мастер-представление и отправляет в базу данных. –

Смежные вопросы