2009-12-25 96 views
1

這讓我瘋狂。我沒有包含任何代碼,因爲我想知道在不影響答案的情況下在概念上做到這一點的最佳方法。Asp.Net MVC MasterPage UserControl UpdateModel

在Asp.Net MVC 2(測試版2010意外)我有一個UserPage Site.Master UserControl「SignIn」。這個用戶控件有3個我想從中獲取數據的字段。 TextBox值「Email」,TextBox值「Password」和bool CheckBox值「RememberMe」。現在我已經嘗試了許多東西,但它們都與傳遞給HomePageController的操作有關,後者具有與UserControl的Model類型不同的Model類型。 UserControl Model =用戶類,HomePageController Model =專門的HomePageData模型,它具有我需要填充我的HomePage視圖內容的東西。

我可以通過ActionLink和具有參數(字符串電子郵件,字符串密碼,布爾?RememberMe)的特定帖子連接到HomePageController操作「SignIn」,但沒有我的HtmlHelper控件的值駐留在UserControl SignIn.ascx中似乎無論我嘗試什麼,都進入了控制器。

SignIn控件真的需要駐留在Site.Master上,但我不確定我是通過使用HomePageController與設置「AccountController」來做正確的事情,但除非我能以某種方式設置「AccountController」將用戶輸入的值輸入到UserControl的3個輸入字段中。

注意:我試過UpdateModel(它不會拋出異常,但用戶對象的所有字段都爲null,TryUpdateModel具有類似結果,TryUpdateModel返回true,但用戶實例上的所有null屬性[AcceptVerbs [ 「Post」]]在一個HomePageController方法的「SignIn」有和沒有參數,再次沒有值傳遞或能夠從UserControl正確檢索。正是我想要做的與MasterPage-> UserControl-> XyzController方案(再次,我不堅持使用HomePageController這樣做,這樣做的正確方法可能會使用「無視圖」控制器。

有人給我一個聖誕快樂(如果任何人的工作大聲笑)

在此先感謝...哦,如果你只知道Vb.Net這也很好,我會將你的答案轉換爲C#。

好的 - 我試了下面的建議無濟於事。我創建了一個簡單的例子(沒有使用的建議爲基礎,從開始)

我的母版(的Site.Master)如下...

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
</head> 
<body> 
    <% Html.RenderPartial("SignIn"); %> 
    <asp:ContentPlaceHolder ID="MainContent" runat="server" /> 
</body> 
</html> 

和我的登入用戶控件如下

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<StackOverflowExample.Models.WebUser>" %> 

Email: <%= Html.TextBox("Email") %> 
Password: <%= Html.TextBox("Password") %> 

<%= Html.ActionLink("Sign In", "SignIn", "Home") %> 

...和我的簡化模型如下....

namespace StackOverflowExample.Models 
{ 
    public class WebUser 
    { 
     public string Email { get; set; } 
     public string Password { get; set; } 
    } 
} 

...和我HomeController的是如下...

namespace StackOverflowExample.Controllers 
{ 
    [HandleError] 
    public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     public ActionResult SignIn() 
     { 
      var user = new WebUser(); 

      try 
      { 
       UpdateModel(user); 
      } 
      catch (Exception ex) 
      { 
       Debug.WriteLine(ex); 
       throw; 
      } 

      return Redirect("Index"); 
     } 
    } 
} 

...從這個簡單的例子,如果我能得到的數據到裏面的HomeController,或任何其他控制器爲此事我可以用WEBUSER實例張貼例子來解決我的真實世界的網站。我知道我在這裏錯過了一些非常基本的東西,我99%肯定與SignIn控件強類型爲WebUser類但HomeController或HomeView(Index.aspx)沒有強類型的事實有關到同一個(或任何其他)模型。

這裏的輕薄Index.aspx的主頁視圖(萬一有人需要它...)

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> 
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> 
</asp:Content> 

回答

2

你缺少Html.BeginForm(「簽到」)

<% using (Html.BeginForm("SignIn","Home") [ %> 
Email: <%= Html.TextBox("Email") %> 
Password: <%= Html.TextBox("Password") %> 

<%= Html.ActionLink("Sign In", "SignIn", "Home") %> 
<% } %> 

並嘗試在該表單中首先包含一個提交按鈕。

+0

行 - 這與我使用提交按鈕的警告.... 現在......爲什麼ActionLink沒有工作?此外,我還需要在頁面上有一個「加入」按鈕,使用相同的字段,我需要能夠判斷加入 - 或 - SignIn是否被點擊,無論它是在控制器內的兩個不同的動作還是參數在同一個動作中...... Join實際上不會重定向到另一個頁面,我需要獲取輸入的值併爲輸入的數據做一些特定的操作以便用戶「加入」作爲成員... – 2009-12-25 22:52:55

+1

對於不同的按鈕使用相同的名稱爲按鈕,但不同的值..在您的行動中,您將該名稱添加到參數Action(string buttonname)並檢查buttonname的值來找出最佳按鈕被按下..對於鏈接工作作爲提交按鈕,將不得不使用一些JavaScript。這是另一個故事。 – 2009-12-25 23:08:43

+2

我猜你有一些webforms背景..關於那些ActionLinks沒有傳遞輸入值 - MVC就像純HTML沒有ViewState ..實際上沒有任何狀態..在webForms中,整個頁面的控件被包裝成一個形成重要的每一個動作。在MVC中發佈你的表單或JavaScript的東西。 – 2009-12-25 23:13:48

0

在您發表的形式,將獲得通過您的帖子行動的唯一事情是對照。因此,如果您有包含ID,電子郵件,密碼,RememberMe和名字的用戶對象,但您只有電子郵件,密碼和RememberMe控件,則在您的UpdateModel之後,ID和First Name將爲空白。最有可能的ID已經可用,但名字肯定不會。

因此,關鍵是在做UpdateModel之前填充這些數據。示例(語法很可能關閉,對不起,在我面前沒有VS):

public ActionResult LoginUser(int id, User user) 
{ 
    User userToSave = UserRepository.FetchUser(id); 
    UpdateModel(userToSave); 

    if (!UserIsValid(userToSave)) //may be in a service, or part of domain 
    { 
    //either return View with model state error, or redirect to LoginUser Get for PRG support 
    } 
    return RedirectToAction("LoggedIn"); 
} 

如果有一個更好的方式來做到這一點,我很樂意也知道=)

+0

謝謝 - 檢查到這個,並會讓你知道... – 2009-12-25 19:52:33

+0

對不起,你的答案可能是對的,但我不能得到它的工作,所以張貼一個例子 – 2009-12-25 20:53:10

0

指定動作,控制器和您的Beginform其他屬性正確,它應該工作 看看在你的控制這link

+0

謝謝 - 我採取了一個鏈接,我想我明白什麼是繼續嘗試這兩種方法,並會讓你知道。 – 2009-12-25 19:53:12

+0

對不起,你的答案可能是對的,但我不能得到它的工作,所以張貼一個例子... – 2009-12-25 20:53:41