Asp.Net MVC MasterPage UserControl UpdateModel - PullRequest
1 голос
/ 25 декабря 2009

Это сводит меня с ума. Я не включаю какой-либо код, потому что хочу знать, как лучше сделать это концептуально, не влияя на ответ.

В Asp.Net MVC 2 (бета-версия 2010), между прочим, у меня есть сайт MasterPage. Мастер с UserControl «SignIn». Этот пользовательский элемент управления имеет 3 поля, из которых я хочу получать данные. Значение TextBox «Email», значение TextBox «Password» и значение bool CheckBox «RememberMe». Теперь я попробовал несколько вещей, но все они относятся к действию, передаваемому в HomePageController, который имеет свой собственный тип Model, который не совпадает с типом Model в UserControl. UserControl Model = класс пользователя, HomePageController Model = специализированная модель HomePageData, в которой есть то, что мне нужно для наполнения моего HomePage View Content.

Я могу подключиться к действию HomePageController «Вход» как через ActionLink, так и через конкретную публикацию с параметрами (строка Email, строка Password, bool? RememberMe), но никакие значения моих элементов управления HtmlHelper, находящихся в UserControl SignIn.ascx, никогда не передаются. в контроллер, похоже, что бы я ни пытался.

Элемент управления SignIn действительно должен находиться на Site.Master, но я не уверен, что правильно делаю, используя HomePageController, а не настраивая «AccountController», но суть спорна, если я не могу каким-то образом получить значения, введенные пользователем в 3 поля ввода UserControl.

К сведению: я пробовал UpdateModel (который не выдает исключение, но все поля пользовательского объекта имеют значение null, TryUpdateModel с похожими результатами, TryUpdateModel возвращает true, но все нулевые свойства в пользовательском экземпляре [AcceptVerbs [" Отправить "]] в методе HomePageController" SignIn "с параметрами и без параметров, опять же, значения не переданы или не могут быть получены из UserControl правильно. Ad nauseam.)

Я искал в интернете и не могу найти пример, который точно выполняет то, что я пытаюсь сделать со сценарием 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>

и мой вход в систему 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");
        }
    }
}

... из этого простого примера, если я смогу получить данные в экземпляр WebUser внутри HomeController или любой другой контроллер в этом отношении, я могу использовать опубликованный пример, чтобы исправить свой реальный веб-сайт. Я знаю, что мне здесь не хватает чего-то очень фундаментального, и я на 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>

Ответы [ 3 ]

2 голосов
/ 26 декабря 2009

в вашем контроле вам не хватает Html.BeginForm ("SignIn")

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

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

и попробуйте сначала включить кнопку отправки в этой форме.

0 голосов
/ 25 декабря 2009

Укажите действие, контроллер и другие атрибуты в вашей Beginform правильно, он должен работать взгляните на эту ссылку

0 голосов
/ 25 декабря 2009

Когда вы отправляете форму, единственное, что будет передано вашему посту, это элементы управления. Поэтому, если у вас есть объект User, содержащий ID, E-mail, Пароль, RememberMe и Имя ..., но у вас есть только элементы управления для E-mail, Password и RememberMe, тогда ID и Имя будут пустыми после вашей UpdateModel. Скорее всего, идентификатор уже будет доступен, но Имя точно не будет.

Итак, ключ заключается в том, чтобы заполнить эти данные ДО выполнения 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");
}

Если есть лучший способ сделать это, я бы тоже хотел знать =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...