Asp.Net MVC MasterPage UserControl UpdateModel

时间:2009-12-25 19:30:07

标签: c# asp.net-mvc

这让我发疯了。我没有包含任何代码,因为我想知道在不影响答案的情况下从概念上做到这一点的最佳方法。

在Asp.Net MVC 2(2010年测试版)中,我有一个MasterPage Site.Master,带有UserControl“SignIn”。此用户控件有3个字段,我想从中获取数据。 TextBox值“Email”,TextBox值“Password”和bool CheckBox值“RememberMe”。现在我尝试了很多东西,但是所有这些都与传递给HomePageController的动作有关,HomePageController有自己的Model类型,与UserControl的Model类型不同。 UserControl Model =用户类,HomePageController Model =专门的HomePageData模型,它有我需要填充我的HomePage View Content的东西。

我可以通过ActionLink和带参数的特定帖子(字符串电子邮件,字符串密码,bool?RememberMe)连接到HomePageController Action“SignIn”但是没有传递给UserControl SignIn.ascx的HtmlHelper控件的值。无论我尝试什么,似乎进入了控制者。

SignIn控件确实需要驻留在Site.Master上,但我不确定我是通过使用HomePageController而不是设置“AccountController”来做正确的事情,但除非我能以某种方式获得,否则这一点没有实际意义用户输入的值到UserControl的3个输入字段。

要注意:我已经尝试过UpdateModel(它不会抛出异常,但是用户对象的所有字段都是null,TryUpdateModel具有类似的结果,TryUpdateModel返回true但是用户实例上的所有空属性,[AcceptVerbs [“在带有和不带参数的HomePageController方法“SignIn”中发布“]],再次没有传递或能够正确地从UserControl中检索值。ad adause。)

我已经在互联网上搜索过,找不到一个例子来完成我正在尝试使用MasterPage-> UserControl-> XyzController场景(再一次,我并不坚持使用HomePageController这样做正确这样做的方法可能是使用“无视”控制器。

有人给我一个圣诞快乐(如果有人在工作,大声笑)

提前致谢...哦,如果你只知道Vb.Net也很好,我会把你的答案转换成C#。

好的 - 我尝试了下面的建议无济于事。我创建了一个简单的例子(没有建议被用作开始的基础)

我的MasterPage(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>

我的SignIn UserControl如下

<%@ 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实例,或者任何其他Controller,我可以使用发布的示例来修复我的真实网站。我知道我在这里缺少一些非常基本的东西,我99%肯定与SignIn控件强类型为WebUser类但HomeController或HomeView(Index.aspx)不是强类型的事实有关相同(或任何其他)模型。

这是一个吝啬的Index.aspx Home View(以防万一有人需要它......)

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

3 个答案:

答案 0 :(得分:2)

你控制中的

你缺少Html.BeginForm(“SignIn”)

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

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

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

答案 1 :(得分:0)

当您发布表单时,唯一会传递给您的帖子操作的是控件。因此,如果您有一个包含ID,电子邮件,密码,记住我和名字的用户对象...但您只有电子邮件,密码和记住我的控件,那么您的UpdateModel后ID和名字将为空。很可能该ID已经可用,但First Name肯定不会。

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

如果有更好的方法,我也很想知道=)

答案 2 :(得分:0)

在Beginform中正确指定操作,控制器和其他属性,它应该有效 看看这个link

相关问题