2

所以,我創建了一個管理頁面,我想在其上放置多個表單。所以,我試着用Partial View和RenderAction來做。MVC3 - 4使用部分視圖的多種形式

我聯繫索引視圖:

@model Rad.ViewModels.AdminViewModel 
@{ 
ViewBag.Title = "Admin"; 
} 

<h2>Admin</h2> 

<div> 
@{ Html.RenderAction("AddProduct"); } 
</div> 

我的局部視圖:

@model Rad.ViewModels.AdminAddProductViewModel 

@using (Html.BeginForm("AddProduct", "Admin")) 
{ 
<h1>@Html.LabelFor(model => model.Name)</h1> 
@Html.TextBoxFor(model => model.Name) 
@Html.ValidationMessageFor(model => model.Name) 
<input type="submit" value="Add"/> 
} 

我的管理控制器:

public class AdminController : Controller 
{ 
    // 
    // GET: /Admin/ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

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

    [HttpPost] 
    public ActionResult AddProduct(AdminAddProductViewModel data) 
    { 
     if (ModelState.IsValid) 
     { 

     } 
     return View("Index"); 
    } 
} 

的問題是與addProduct命令的HttpPost版本。如果我將它保留爲返回視圖(「索引」),它將進入無限循環。但是,如果我返回PartialView(數據),它會正確顯示錯誤,但沒有索引視圖。所以,它只顯示部分視圖。有沒有辦法在一個頁面上有多個表單並將服務器端驗證返回到頁面?

回答

4

好吧,我能解決這個問題:

聯繫主索引頁面:

@model Rad.ViewModels.AdminViewModel 
@{ 
ViewBag.Title = "Admin"; 
} 

<h2>Admin</h2> 

<div> 
@Html.Partial("AddProduct", Model.AddProduct) 
</div> 

添加產品管窺:

@model Rad.ViewModels.AdminAddProductViewModel 

@using (Html.BeginForm("AddProduct", "Admin")) 
{ 
<h1>@Html.LabelFor(model => model.Name)</h1> 
@Html.TextBoxFor(model => model.Name) 
@Html.ValidationMessageFor(model => model.Name) 
<input type="submit" value="Add"/> 
} 

簡單AdminAddProductViewModel:

public class AdminAddProductViewModel 
{ 
    [DisplayName("Add Product:")] 
    [Required] 
    [StringLength(50)] 
    [RegularExpression(@"^[a-zA-Z0-9\s]+$")] 
    public string Name { get; set; } 
} 

含AdminViewModel:

public class AdminViewModel 
{ 
    public AdminAddProductViewModel AddProduct { get; set; } 

    public AdminViewModel() 
    { 
     AddProduct = new AdminAddProductViewModel(); 
    } 
} 

管理控制器:

public ActionResult Index() 
    { 
     AdminViewModel data = new AdminViewModel(); 
     return View(data); 
    } 

    [HttpGet] 
    public ActionResult Index(AdminViewModel data) 
    { 
     return View(data); 
    } 

    [HttpPost] 
    public ActionResult AddProduct(AdminAddProductViewModel data) 
    { 
     AdminViewModel admin = new AdminViewModel(); 
     admin.AddProduct = data; 
     if (ModelState.IsValid) 
     { 

     } 
     return View("Index", admin); 
    } 

現在,我知道我說的是多種形式的,只有在這裏展示的一種形式,但如果你想爲另一種形式加入到這一點,只是創建另一個局部視圖,另一個子視圖模型,並將該子視圖模型添加到AdminViewModel。

0

你試過ajax.beginform()嗎? 命名部分視圖周圍的div,並將UpdateTargetId設置爲該名稱。

然後查詢將替換舊的div。

不要忘記引用Java腳本庫的Ajax!

+0

我想做這個服務器端。 – ScubaSteve

+0

它不是服務器端嗎? Ajax-Request發送到您應該在服務器端的控制器,而不是? – Tobias

+0

是的,它會通過服務器進行檢查,但如果關閉JS,則不會進行呼叫。 – ScubaSteve