Кнопки бритвы MVC - PullRequest
       7

Кнопки бритвы MVC

2 голосов
/ 15 июня 2011

Привет, я новичок в MVC Razor

Я пытался создать страницу с 3 кнопками для вставки, удаления и обновления.

Мой вид выглядит как

        <div>    
          @using (Html.BeginForm())
           {

                <input type="button" class="button1" value="Insert" />
                <input type="button" class="button1" value="Delete" />
                <input type="button" class="button1" value="Update" /> 
           }
        </div>

И мой контроллер похож на

       public ActionResult Index()
       {
              return View();
       }

Как я получу события этих кнопок в моем контроллере, чтобы я мог написать логику для каждой кнопки.Пожалуйста, помогите мне получить кодировку или любую подходящую ссылку, которая поможет решить эту проблему.

Спасибо Сан

Ответы [ 4 ]

8 голосов
/ 15 июня 2011

Дайте кнопкам название:

<div>    
 @using (Html.BeginForm())
 {
     <input type="button" name="button" class="button1" value="Insert" />
     <input type="button" name="button" class="button1" value="Delete" />
     <input type="button" name="button" class="button1" value="Update" /> 
 }
</div>

И используйте это в своих действиях:

public ActionResult Index(string button)
{
    switch (button)  
    {
        case "Insert": ...
        case "Update": ...
        case "Delete": ...       
    }

    return View();
}

При всем этом я бы не стал использовать этот подход.Я бы на лету изменил действие формы для различных действий контроллера (используя Url.Action), подключив этот код к обработчикам кликов, используя jQuery.

4 голосов
/ 15 июня 2011

[править]

, чтобы повторить мою точку зрения в комментариях к другим ответам: когда вы связываете логику со значением кнопки в C #, вы привязываете свой код C # к этому языку.

Представьте, что у вас есть кнопка Сохранить в английской версии как:

<input type="submit" value="Insert" name='button' />

, и в вашем коде вы собираетесь переключаться, используя значение:

public ActionResult Index(string button)
{
    switch (button)  
    {
        case "Insert": ...
        case "Update": ...
        case "Delete": ...       
    }

    return View();
}

Сейчас- когда эта форма просматривается на другом языке - как вы думаете, что произойдет?!?!

вот вывод welsh html:

<input type="submit" value="Mewnosod" name='button' />

и немецкий:

<input type="submit" value="Einfügen" name='button' />

Как это КОГДА-ЛИБО будет работать?!

Глобализация не является отдельной проблемой !!!!

Ваше действие будет выглядеть следующим образом, если вы используете этот метод:

public ActionResult Index(string button)
{
    switch (button)  
    {
        case "Insert": ...
        case "Update": ...
        case "Delete": ...     
        case "Einfügen": ...  
        case "Mewnosod": ....
        .... a load of other languages for each action type - 
    }

    return View();
}

пожалуйста ... серьезно ....

[/ edit]

Вот мой код селектора действий MVC: Селектор действий Asp.Net Mvc

По сути, вам нужен класс селектора действий:

/// <summary>
/// AcceptParameterAttribute to enable submit buttons to execute specific action methods.
/// </summary>
public class AcceptParameterAttribute : ActionMethodSelectorAttribute
{
    /// <summary>
    /// Gets or sets the value to use in submit button to identify which method to select. This must be unique in each controller.
    /// </summary>
    public string Action { get; set; }
 
    /// <summary>
    /// Determines whether the action method selection is valid for the specified controller context.
    /// </summary>
    /// <param name="controllerContext">The controller context.</param>
    /// <param name="methodInfo">Information about the action method.</param>
    /// <returns>true if the action method selection is valid for the specified controller context; otherwise, false.</returns>
    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
    {
        if (controllerContext == null)
        {
            throw new ArgumentNullException("controllerContext");
        }
 
        var req = controllerContext.RequestContext.HttpContext.Request;
 
        return req.Form.AllKeys.Contains(this.Action);
 
    }
}

, который работает от имени, которое вы даете кнопке.

Затем вы можете украсить действия с помощью:

[AcceptParameter(Action = "Edit")]
public ActionResult Person_Edit(PersonViewModel model){
...
}

Переключение в действии грязно - это гораздо более чистый подход.Я думаю, что гораздо более естественным тоже.

1 голос
/ 29 октября 2013

Здесь улучшен атрибут AcceptParameterAttribute, если вы используете локализацию, как я

public class AcceptParameterAttribute : ActionMethodSelectorAttribute
{
    public string Name { get; set; }
    public Type ResourceType { set; get; }
    public string Value { get; set; }

    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
    {
        HttpRequestBase request = controllerContext.RequestContext.HttpContext.Request;
        if (ResourceType != null)
        {
            ResourceManager resourceManager = new ResourceManager(ResourceType);
            return request.Form[Name] == resourceManager.GetString(Value);
        }
        return request.Form[Name] == Value;
    }
}

Использование аналогично DisplayAttribute

[AcceptParameter(ResourceType = typeof(Resources), Name = "submit", Value = "Search")]

и кнопка

<input type="button" name="submit" value="@Resources.Search" />
1 голос
/ 15 июня 2011

Я бы предложил вам прочитать простое руководство по MVC3 - оно даст вам возможность понять основные принципы MVC Framework. Вы можете начать здесь .

Теперь к вашему вопросу: лучший подход - вызывать с каждой кнопки какое-то действие в контроллере.

@Html.ActionLink("Insert", "Insert") 

или

@Html.ActionLink("Edit", "Edit", new{Id=lineId}).

Затем, когда пользователь щелкнет по этой ссылке, он перейдет к правильному виду, готовому выполнить эту задачу.

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