2009-05-05 171 views
8

語境
突然想到說,我有:
在佈局的Site.Master:多種形式

<div class="leftColumn"> 
    <asp:ContentPlaceHolder ID="MainContent" runat="server" /> 
</div> 
<div class="rightColumn"> 
    <% Html.RenderPartial("_Login"); %> 
    <asp:ContentPlaceHolder ID="SideContent" runat="server" /> 
</div> 

登錄partialView樣子:

<form action="/myApp/Account/Login" method="post"> 
    <input name="name" />Name<br /> 
    <input name="password" type="password" />Password<br /> 
    <button>Login</button> 
</form> 

是有可能僅更新登錄窗口小部件表單,而不是整個內容頁面?

回答

15

如果您所指的是一篇http文章,則只有通過表單中的提交按鈕啓動的一篇文章(它也可以由javascript啓動)將發佈到服務器。

如果您的表單嵌套,那麼這將無法正常工作。外表將始終發佈到服務器。

在下面的示例HTML中,單擊第一個表單上的提交按鈕將不會將第二個表單中的值發送到服務器。同樣,點擊第二個提交按鈕不會發布第一個表單的值。

<html> 
... 
    <body> 
    <div> 

     <form action="/Login/Login" method="post"> 
     <input type="text" name="username" value="" /> 
     <input type="text" name="passowrd" value="" /> 
     <input type="submit" name="login" value="Login" /> 
     </form> 


     <form action="/Login/AdminLogin" method="post"> 
     <input type="text" name="username" value="" /> 
     <input type="text" name="passowrd" value="" /> 
     <input type="submit" name="login" value="Login Admin" /> 
     </form> 
    </div> 
</body> 
</html> 

如果你只是想更新/改變窗體節之一,則沒有這個不能在沒有使用JavaScript和執行一個JavaScript後(又名Ajax)進行。

0
if(pass != true) 
{ 
ViewData["Message'] = "Hey your login failed!"; Return View("Login") 
} 

上的ViewPage

<form action="/tralala/Account/Login" method="post"> 
    <input name="name" />Name<br /> 
    <input name="password" type="password" />Password<br /> 

    <button>Login</button> 
<div style="color: red"><%=ViewData["Message"] %><div> 
</form> 
+1

你錯過了這一點。問題是 - 如何更新1表單,如果可能,而不是如何使用ViewData字典。 – 2009-05-05 00:45:50

+0

對不起,我一直在讀你的問題,我不明白你在問什麼。 – Skiltz 2009-05-05 00:54:51

+1

我只是問,如果頁面上有2

元素,當時只能更新其中的1個,而不會觸及另一個元素。 – 2009-05-05 01:01:22

0

你的問題不是很清楚。

但據我所知,答案很可能是肯定的。您可以根據用戶輸入更新任何你想要的東西。

1

如果您構建一個接受FormCollection的控制器方法,並且您的視圖有兩個定義的窗體,則返回的formcollection將填充來自窗體A或窗體B的值。您可以檢查formCollection並根據價值。如果你想要非常明確,你可以在兩種形式中使用相同的隱藏變量,並且這些變量的值可以幫助你做出選擇。

這是一種方法。我敢肯定,有幾種方法可以解決這個問題。

1

如果你有兩個簡單的形式,你可以用這個形式給出:

創建兩個不同的部分景色。

@model CustomerInfoModel 
@using (Ajax.BeginForm("CustomerInfo", "Customer", new AjaxOptions { HttpMethod = "Post", OnBegin = "InfoLoading", OnComplete = "InfoCompleted" }, new { id = "info", @class = "form-horizontal" })) 
    { 
    <input type="text" class="form-control" name="Name" id="Name" value="@Model.Name" /> 
    <input type="email" class="form-control" name="Email" id="Email" value="@Model.Email" /> 
    <button type="submit" id="save-info" class="btn-medium red">Save</button> 
    } 

@model CustomerPasswordChangeModel 
@using (Ajax.BeginForm("CustomerPasswordChange", "Customer", new AjaxOptions { HttpMethod = "Post", OnBegin = "InfoLoading", OnComplete = "InfoCompleted" }, new { id = "change", @class = "form-horizontal" })) 
{ 
<input type="password" class="form-control" name="OldPassword" id="OldPassword" value="" /> 
<input type="password" class="form-control" name="NewPassword" id="NewPassword" value="" /> 
<button type="submit" id="save-change" class="btn-medium red" autocomplete="off">Save</button> 
} 

在你的父視圖,

@Html.Partial("CustomerInfo", Model.CustomerInfo) 

@Html.Partial("CustomerPasswordChange", Model.CustomerPasswordChange) 

在控制器:

[HttpPost] 
    public ActionResult CustomerInfo([Bind(Include = "Name,Email")] CustomerInfoModel model) 
    { 
     if (ModelState.IsValid) 
      return new Json(new { success=true, message="Updated.", errors=null); 

// do you logic 

     return new Json(new { success=false, message="", errors=getHtmlContent(ModelState.Values.SelectMany(v => v.Errors).ToList(), "ModelError")); 
    } 

    [HttpPost] 
    public ActionResult CustomerPasswordChange([Bind(Include = "OldPassword,NewPassword")] CustomerPasswordChangeModel model) 
    { 
     if (ModelState.IsValid) 
      return new Json(new { success=true, message="Updated.", errors=null); 

// do you logic 

     return new Json(new { success=false, message="", errors=getHtmlContent(ModelState.Values.SelectMany(v => v.Errors).ToList(), "ModelError")); 
    } 

這會做你想做的事情。

注意:getHtmlContent方法只是生成一個錯誤消息以顯示在頁面上。沒什麼特別的。如有需要,我可以分享。