Вызов метода контроллера из представления в MVC - PullRequest
1 голос
/ 02 июля 2011

Я новичок в MVC Framework и здесь застрял с методом обновления, кто-нибудь может мне помочь?

MyCode в представлении:

       <table>
        <% if (Model == null || Model.Count <= 0)
        {
        %>
        <tr>
        <td >
     No Records found !!.Please search.
     </td>
     </tr>
    <% }
     else
     {
     foreach (var item in Model)
     { %>

     <tr>
     <td>Id</td>
     <td><%: item.ID %></td>

    <tr>
     <td > System : </td>
    <td >                                                                        
     <input id="txtSystemName" value=' <%: item.System %>' type="text"style="height: 20px; width: 120px;" />
     </td>
     <td >TaskName :</td>
    <td><input id="txtTaskName" value='<%: item.TaskName %>' class="TextBoxStyle" type="text"
    style="height: 20px; width: 340px;" /><td/>
    <tr>

    <tr>
    <td><input id="Submit1" name="btnSave" type="submit" value="Save" class="ButtonStyle"
     style="width: 100px; height: 20px" /></td>
    </tr>
<%
}
}
%>

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

Может кто-нибудь помочь мне в этом.заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 03 июля 2011

Вот что я бы вам предложил.Начнем с модели представления, которая будет представлять строку таблицы:

public class MyViewModel
{
    public int Id { get; set; }
    [Required]
    public string SystemName { get; set; }
    public string TaskName { get; set; }
}

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

public class HomeController : Controller
{
    public ActionResult Index()
    {
        // I have hardcoded some data here in order to return a list
        // of models => in your case you would probably fetch those from
        // some data source
        var model = Enumerable.Range(1, 7).Select(x => new MyViewModel
        {
            Id = x,
            SystemName = "system " + x,
            TaskName = "task " + x
        });
        return View(model);
    }

    [HttpPost]
    public ActionResult Update(MyViewModel model)
    {
        // This action will be responsible for updating the view model
        if (ModelState.IsValid)
        {
            // The model is valid
            // TODO: update it using a repository
            return Json(new { success = true });
        }
        // there was an error => redisplay the view so that the user can fix it
        return PartialView("_MyViewModel", model);
    }
}

Затем давайте перейдемна главном виде (~/Views/Home/Index.aspx):

<%@ Page 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<IEnumerable<AppName.Models.MyViewModel>>" 
%>

...

<table>
    <thead>
        <tr>
            <th>Id</th>
            <th>System name</th>
            <th>Task name</th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        <% if (Model == null || Model.Count() < 1) { %>
            <tr>        
                <td colspan="4">
                    No Records found !! Please search.
                </td>
            </tr>
        <% } else { %>
            <% foreach (var item in Model) { %>
                <%= Html.Partial("_MyViewModel", item) %>
            <% } %>
        <% } %>
    </tbody>
</table>

Затем мы определяем частичное для модели вида (~/Views/Home/_MyViewModel.ascx):

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<AppName.Models.MyViewModel>" 
%>
<tr>
    <% using (Html.BeginForm("Update", "Home", FormMethod.Post, new { @class = "updateForm" })) { %>
        <td>
            <%= Html.DisplayFor(x => x.Id) %>
            <%= Html.HiddenFor(x => x.Id) %>
        </td>
        <td>
            <%= Html.EditorFor(x => x.SystemName) %>
            <%= Html.ValidationMessageFor(x => x.SystemName) %>
        </td>
        <td>
            <%= Html.EditorFor(x => x.TaskName) %>
            <%= Html.ValidationMessageFor(x => x.TaskName) %>
        </td>
        <td>
            <input type="submit" value="Update" />
        </td>
    <% } %>
</tr>

и последняя часть должнаОслабьте эти формы.Это можно сделать незаметно в отдельном файле JavaScript с помощью jquery:

$(function() {
    $('.updateForm').submit(function () {
        var form = $(this);
        $.ajax({
            url: this.action,
            type: this.method,
            data: $(this).serialize(),
            success: function (result) {
                if (!result.success) {
                    form.closest('tr').replaceWith(result);
                } else {
                    alert('record successfully updated');
                }
            }
        });
        return false;
    });
});
0 голосов
/ 02 июля 2011

У меня обычно есть два метода действия в контроллере.Один, который обрабатывает GET, а другой обрабатывает POST.Исходная загрузка страницы - это GET, так что вот этот парень:

[HttpGet]
public ActionResult Tasks()
{
    // get your object/model.
    List<Task> tasks = DataAccessLayer.GetTasks();

    // pass your model to the strongly-typed view.
    return View(tasks);
}


[HttpPost]
public ActionResult Tasks(List<Task> tasks)
{
    // check if all model property requirements are satisfied.
    if (ModelState.isValid)
    {
        // ... update tasks...
    }

    // return updated objects/model to view.
    return View(tasks);
}

Кроме того, вам следует переключиться на использование Html Helpers , вместо этого вручную полусвязать свойства вашей модели.Тогда свойства вашей модели легко сопоставятся с элементами на странице.Например:

<%: Html.TextBoxFor(m => m.Name) %>

Это выглядело бы как <input type="text" id="Name" name="Name" /> для свойства Name вашей модели (при условии, что это объект задачи).

Один из способов обработки списков в вашей модели (илисама модель) заставляет атрибут name полей ввода содержать свойство index вашего списка.Например, проверьте:

Привязка модели к списку

Еще один способ обработки списков - создание настраиваемого помощника по HTML для общих списков.Вот несколько ссылок, которые помогут с этим:

Помощник по списку HTML ASP.Net MVC

ASP.NET MVC 3: Создание настраиваемого помощника по HTML для рендерингаСписок моделей в виде таблицы

Я не вижу определения вашей формы в коде, но по умолчанию кнопка отправки должна отправить форму и вызвать метод POST, который передается в модель / объект.

Надеюсь, это поможет.

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