Как выполнить дополнительное действие (т. е. вычислить поля) в ASP.NET MVC?

Мне нужно выполнить некоторые вычисления в представлении ASP.NET MVC, действие, отличное от отправки формы. Я пробовал различные методы передачи текущей модели новому действию контроллера через ActionLink, но модель не передается.

public ActionResult Calculate(MuralProject proj)
{
    ProjectFormRepository db = new ProjectFormRepository();
    List<Constant> constants = db.GetConstantsByFormType(FormTypeEnum.Murals);

    proj.Materials = new MuralMaterials();
    proj.Materials.Volunteers = this.GetVolunteerCount(constants, proj);

    this.InitializeView(); 
    return View("View", proj);
}

Каким должен быть мой синтаксис Html.ActionLink, чтобы я мог вызвать это и иметь возвращаемое представление с теми же данными модели (с рассчитанными изменениями)? В качестве альтернативы, есть ли другой способ сделать это?

Я также попробовал метод Ajax.ActionLink, но столкнулся с той же проблемой.

Изменить: «Дайте кнопкам отправки имя, а затем проверьте отправленное значение в методе вашего контроллера», показан метод вот то, что я искал.


person paulwhit    schedule 16.03.2009    source источник


Ответы (2)


[Видел ваши комментарии; Я опубликую этот ответ здесь, чтобы вы могли пометить вопрос решенным и отметить его как вики сообщества, чтобы я не получил за него репутацию — Дилан]

Дайте своим кнопкам отправки имя, а затем проверьте отправленное значение в методе вашего контроллера:

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" name="submitButton" value="Send" />
<input type="submit" name="submitButton" value="Cancel" />
<% Html.EndForm(); %>

отправка в

public class MyController : Controller {
    public ActionResult MyAction(string submitButton) {
        switch(submitButton) {
            case "Send":
                // delegate sending to another controller action
                return(Send());
            case "Cancel":
                // call another action to perform the cancellation
                return(Cancel());
            default:
                // If they've submitted the form without a submitButton, 
                // just return the view again.
                return(View());
        }
    }

    private ActionResult Cancel() {
        // process the cancellation request here.
        return(View("Cancelled"));
    }

    private ActionResult Send() {
        // perform the actual send operation here.
        return(View("SendConfirmed"));
    }

}
person Community    schedule 17.03.2009
comment
это удручает, если нам приходится делать такие вещи, что бы ни случилось с аргументом «разделение интересов»? Майкрософт ох ха маркетинговая риторика! я подавлен тем, что это лучшее, что может предоставить фреймворк для такого распространенного сценария - person Erx_VB.NExT.Coder; 23.02.2010
comment
Какие проблемы, по вашему мнению, четко не разделены? Если вас беспокоят волшебные строки, можно легко настроить статический класс или внешний файл ресурсов, содержащий заголовки и значения кнопок, чтобы не полагаться на сравнения волшебных строк. - person Dylan Beattie; 24.02.2010
comment
Как бы вы передавали данные соответствующему действию? - person rsteckly; 07.01.2011

Ссылка действия просто указывает на действие. Он транслируется в тег <a href="action">action</a>. Действие, на которое оно ссылается, не знает о состоянии только что покинутой страницы.

Вероятно, вам следует выполнить «POST» для действия, но оно будет отправлять только данные формы, а не объект (хотя mvc может автоматически сопоставлять поля формы с объектом).

person ChadT    schedule 16.03.2009
comment
Хорошо, это может быть полезно. Кажется, я не могу понять, как сопоставить данные формы с объектом, если это не отправка формы, которую я делаю. - person paulwhit; 16.03.2009
comment
у меня есть набор полей, которые в сочетании с некоторыми серверными вычислениями заполняют другой набор полей. все поля находятся в модели - person paulwhit; 17.03.2009
comment
Поэтому опубликуйте измененные поля в новом действии, а также опубликуйте идентификатор модели, которую нужно обновить. В вашем действии загрузить модель в соответствии с идентификатором, а затем заменить измененными значениями? - person ChadT; 17.03.2009