代码之家  ›  专栏  ›  技术社区  ›  Dave Jellison

Asp.Net MVC母版页用户控件更新模型

  •  1
  • Dave Jellison  · 技术社区  · 16 年前

    在Asp.NETMVC2(顺便说一句,beta 2010)中,我有一个母版页Site.Master,其中有一个用户控件“sign”。此用户控件有3个字段,我想从中获取数据。文本框值“Email”、文本框值“Password”和布尔复选框值“RememberMe”。现在我尝试了很多方法,但都与传递给HomePageController的操作有关,HomePageController有自己的模型类型,与UserControl的模型类型不同。UserControl模型=用户类,HomePageController模型=专门的HomePageData模型,其中包含填充主页视图内容所需的内容。

    我可以通过ActionLink和带有参数(字符串电子邮件、字符串密码、bool?请记住,rme)但是无论我做什么尝试,驻留在UserControl SignIn.ascx上的HtmlHelper控件的值都不会传递到conroller中。

    SignIn控件确实需要驻留在站点上。Master但我不确定使用HomePageController与设置“AccountController”是否正确,但这一点没有意义,除非我能以某种方式将用户输入的值输入UserControl的3个输入字段。

    注意:我已经尝试了UpdateModel(它不会引发异常,但用户对象的所有字段都为null),TryUpdateModel具有类似的结果,TryUpdateModel在HomePageController方法“SignIn”中返回true但用户实例上的所有null属性,[AcceptVerbs[“Post”]],带参数和不带参数,同样,没有传递值或无法从UserControl正确检索值。令人作呕。)

    我在互联网上搜索过,没有找到一个例子能够准确地完成我试图使用母版页所做的事情->用户控制->XyzController场景(同样,我不坚持使用HomePageController,因此正确的方法可能是使用“无视图”控制器。

    好的-我尝试了下面的建议,但没有效果。我创建了一个简单的示例(没有将建议用作开始的基础)

    我的主页(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; }
        }
    }
    

    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)不是强类型化到同一(或任何其他)模型。

    这是skimpy 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>
    
    3 回复  |  直到 16 年前
        1
  •  2
  •   Alexander Taran    16 年前

    在您的控件中缺少Html.BeginForm(“登录”)

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

    并尝试在表单中首先包含一个提交按钮。

        2
  •  0
  •   Andrew    16 年前

    因此,关键是在执行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");
    }
    

        3
  •  0
  •   Community Mohan Dere    9 年前

    在您的系统中指定操作、控制器和其他属性。如果正确,它应该可以工作 看看这个 link