Во-первых, вам нужно установить PUT или POST ActionMethodSelectorAttribute
:
[HttpPut] // <- ActionMethodSelectorAttribute
public ActionResult Company(Guid uid, int id, int total, string url)
{ // TODO: Bananas }
Пример:
Решение проблемы с использованием форм в представлении и отдельных методов для каждого запроса (предпочтительно в архитектуре ASP.NET MVC):
Изменить метод компании
public ActionResult Company(int id)
{
return View(companyData.Single(x => x.Id == id)); // The filter can be anything
}
Метод действия POST
[HttpPost]
[ActionName("Company")] // <- Allows to create multiple Actions with the same parameters which also refer to the same ActionName
public ActionResult Company_Post(Guid uid, int id, int total, string url)
{
return Content(
String.Format("POST Values:<br />Guid: {0}<br /> Id: {1}<br /> Total: {2}<br /> Url: {3}", uid, id, total, url)
);
}
Код представления POST (это строго типизированное представление для типа «Компания»)
<% using (Html.BeginForm()) {%>
<%: Html.ValidationSummary(true) %>
<fieldset>
<legend>Fields</legend>
<div class="editor-label">
<%: Html.LabelFor(model => model.Uid) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Uid)%>
<%: Html.ValidationMessageFor(model => model.Uid)%>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Id) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Id) %>
<%: Html.ValidationMessageFor(model => model.Id) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Total) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Total) %>
<%: Html.ValidationMessageFor(model => model.Total) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Url) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Url) %>
<%: Html.ValidationMessageFor(model => model.Url) %>
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
<% } %>
Вывод POST
POST Values:
Guid: 12345678-1234-1234-1234-123456789012
Id: 1
Total: 10
Url: #1
Как видите, все значения отправляются обратно в контроллер. (Без необходимости сначала собирать / инициализировать их)
Метод действия PUT
[HttpPut]
[ActionName("Company")] // <- Allows to create multiple Actions with the same parameters which also refer to the same ActionName
public ActionResult Company_Put(Guid uid, int id, int total, string url)
{
return Content(
String.Format("PUT: Values:<br />Guid: {0}<br /> Id: {1}<br /> Total: {2}<br /> Url: {3}", uid, id, total, url)
);
}
PUT View Code (тот же вид, что и выше, только слегка измененный
<% using (Html.BeginForm()) {%>
<%: Html.HttpMethodOverride(HttpVerbs.Put) %> // <- Only this one is new, it renders a different form
<%: Html.ValidationSummary(true) %>
...
PUT Просмотр визуализированного HTML-кода
<form action="/dataentry/Company/1" method="post"><input name="X-HTTP-Method-Override" type="hidden" value="PUT" />
PUT Output
PUT: Values:
Guid: 12345678-1234-1234-1234-123456789012
Id: 1
Total: 10
Url: #1
Это был бы строго типизированный и безопасный способ отправки данных назад и вперед от контроллера и представлений.
Сопоставление опубликованных / введенных значений выполняется платформой MVC автоматически. Поэтому, если вам нужно что-то изменить в своей модели Домена, вам нужно всего лишь добавить новые поля в ваше представление и настроить параметры метода.
Даже если это не то, что вы хотели, я все же думаю, что не так уж и плохо, когда его где-то записали: -).