2014-11-20 3 views
2

Этот вопрос действительно похож на мой последний, но это связано с передачей нескольких параметров. Мой контроллер имеет два метода с тем же именем, но один получает значение nullable int, чтобы определить, какое действие нужно предпринять для публикации (я не знаю, является ли это хорошим дизайнерским решением). Вот код:Параметр, переданный контроллеру почты, всегда равен нулю

public ActionResult EventDetails(int? eventID) 
{ 
    EventDetailsViewModel model = new EventDetailsViewModel(); 

    if (eventID != null) 
    { 
     model.afterPost = false; 
     model.currentAttendance = getCountAttending(eventID); 
     model.currentUser = getCurrentUserProfile(User.Identity.Name); 
     model.eventDetails = getEventDetails(eventID); 
     model.eventRestrictions = getEventRestrictions(eventID); 
     model.usersAttending = getUsersAttending(eventID); 
     return View(model); 
    } 
    else 
    { 
     return View(); 
    } 
} 

[HttpPost] 
public ActionResult EventDetails(int? eventID, int? action) 
{ 
    EventDetailsViewModel model = new EventDetailsViewModel(); 

    if (eventID != null) 
    { 
     model.afterPost = true; 
     model.currentAttendance = getCountAttending(eventID); 
     model.currentUser = getCurrentUserProfile(User.Identity.Name); 
     model.eventDetails = getEventDetails(eventID); 
     model.eventDetails["ActionID"] = action.ToString(); 
     model.eventRestrictions = getEventRestrictions(eventID); 
     model.usersAttending = getUsersAttending(eventID); 
     return View(model); 
    } 
    else 
    { 
     return View(); 
    } 
} 

вид огромен, но я выложу соответствующую часть:

@if(User.Identity.IsAuthenticated) 
{ 
if (!Model.eventDetails["Event_Owned"].Equals("true")) 
{ 
    <div class="joinEventButton"> 
     @if(Model.eventDetails["Event_Current"].Equals("true")) 
     { 
      <form method="post" action="@Url.Action("EventDetails", "Event", new{eventID = Int32.Parse(Model.eventDetails["EventID"]), action = Int32.Parse(Model.eventDetails["CODE_RequestInvitation"])})"> 
      <input type="submit" value="Request Invitation" class="submitButton submitButton-green"/> 
      </form> 
     } 
     else 
     { 
      <button class="disabledButton disabledButton-grey">Request Invitation</button> 
     } 
    </div> 
} 

и просто для хорошей меры, мои маршруты:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     //routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 

Таким образом, идея заключается в том, что на основе проверки подлинности и наличия у них конкретного события, на которое они смотрят, на экране будут отображаться разные кнопки. Это определенно для того, когда они хотят присоединиться к событию, они могут нажать кнопку, чтобы запросить приглашение. Контроллер знает это из-за того, что значение int передается как CODE_RequestInvitation. Возвращаемое действие всегда равно null. Я не могу понять, что случилось.

+0

Попробуйте поместить EVENTID в скрытом поле в вашей форме, и это, возможно, отправят на потом. – CRice

+0

Осмотрите html. Какова ценность атрибута формы 'action'? –

ответ

3

Проблема заключается в использовании имени параметра action (что противоречит атрибуту action). Измените его на другое имя, и оно будет работать. Осмотрите его html элемента <form> до и после изменения.

Ваш код для создания формы ужасен, и использование Int32.Parse() бессмысленно.

@using (Html.BeginForm("EventDetails", "Event", { eventID = Model.eventDetails["EventID"], actionID = Model.eventDetails["CODE_RequestInvitation"] }, FormMethod.Post)) 
{ 
    <input type="submit" value="Request Invitation" class="submitButton submitButton-green"/> 
} 

и отправить обратно в

[HttpPost] 
public ActionResult EventDetails(int? eventID, int? actionID) 
+0

Удивительно, что сработало! Такие странные хитросплетения, как это, меня трогают больше, чем я осмелюсь сказать. Большое вам спасибо за ваш ответ снова (вы помогли мне в прошлый раз). –

+0

Нет проблем, и обратите внимание на редактирование. Всегда используйте 'Html.BeginForm' для создания ваших форм. –

+0

С другой стороны, вы прокомментировали мое любопытство с комментарием плохой формы. Я все еще просто изучаю C# и MVC и думаю, что было бы здорово, если бы вы могли сказать мне, какие ужасные фрагменты, чтобы я мог их исправить. –

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