2009-12-25 5 views
1

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

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

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

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

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

Я просмотрел интернет и не могу найти пример выполнения именно то, что я пытаюсь сделать с сценарием MasterPage-> UserControl-> XyzController (опять же, я не настаиваю на использовании HomePageController для этого, поэтому правильный способ сделать это может использовать «невидимый» контроллер.

Кто-нибудь дарит мне счастливое Рождество (если кто-то работает lol)

Заранее спасибо ... о, и если вы знаете только Vb.Net, это тоже хорошо, я конвертирую ваш ответ на C#.

OK - Я пробовал следующие предложения безрезультатно. Я создал простой пример (без предложения используется в качестве основы, чтобы начать с)

мой 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> 

и мой 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 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> 

ответ

2

в вашем управления вам не хватает Html.BeginForm («») для входа в аккаунт

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

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

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

+0

OK - Это работает с предостережением, что я использую кнопку отправки ... Теперь ... почему ActionLink не работает? Кроме того, мне нужно иметь кнопку «Присоединиться» на странице, используя те же поля, и мне нужно указать, было ли нажато Join-or- SignIn, было ли это в двух разных действиях внутри контроллера или параметре внутри одного и того же действия ... Присоединение фактически не просто перенаправляется на другую страницу, мне нужно получить введенные значения и сделать что-то конкретное с введенными данными, чтобы пользователь мог «присоединиться» к члену ... –

+1

Для разных вы используете одно и то же имя для кнопок, но другое значение .. в вашем действии вы добавляете это имя к параметрам Action (string buttonname) и проверяете значение имени кнопки, чтобы выяснить, какая кнопка была нажата .. для ссылок на работу как кнопки отправки, Мне нужно будет использовать javascript. Это еще одна история. –

+2

Я предполагаю, что у вас есть фон webforms. О тех ActionLinks, которые не передают входные значения. MVC похож на чистый HTML, нет ViewState. На самом деле никакого состояния вообще нет. В webForms полная страница контуров сворачивается в форма, с которой возвращается каждый действие. в MVC, чтобы опубликовать что-то, что вам нужно, или javascript. –

0

Когда вы POST форму, единственное, что будет получить передается на ваш пост действия являются элементы управления. Поэтому, если у вас есть объект User, содержащий ID, E-mail, Password, RememberMe и First Name ..., но у вас есть только элементы управления для E-mail, Password и RememberMe, тогда идентификатор и имя будут пустыми после вашего UpdateModel. Скорее всего, идентификатор уже будет доступен, но 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"); 
} 

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

+0

Спасибо, что проверили в этом и дадут вам знать ... –

+0

Извините, ваш ответ может быть правильным, но я не могу заставить его работать, поэтому отправьте пример –

0

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

+0

Спасибо - я взял ссылку, и я думаю, что понимаю, что продолжая так стараться оба подхода и сообщит вам об этом. –

+0

Извините, ваш ответ может быть прав, но я не могу заставить его работать, поэтому отправляю пример ... –

Смежные вопросы