asp.net mvc + jEditable - сохраняет отредактированные данные ячейки в базе данных - PullRequest
0 голосов
/ 20 июля 2011

Я пытаюсь использовать плагин jquery DataTables для отображения подробностей из моей таблицы БД и использовать Jeditable, чтобы позволить пользователю редактировать каждую ячейку в строке.Отредактированные данные следует отправить обратно и сохранить в базе данных.Я наткнулся на пример, который очень похож на мой сценарий: http://naspinski.net/post/Inline-AJAX-DropDown-and-Text-Editing-with-AspNet-MVC-and-jQuery.aspx, и я попытался реализовать его в качестве руководства.

Однако здесь я столкнулся с некоторой проблемой:

  1. Когда и как я должен использовать Url.Content () и что должно быть передано и возвращено ??

  2. При попытке редактировать таблицу выдается ошибкаcell: [MissingMethodException]: для этого объекта не определен конструктор без параметров.

Я знал, что сделал что-то здесь очень неправильно, но я просто не смог очистить свои сомнения.Вот скрипт, который я использовал, чтобы сделать мою ячейку редактируемой:

$(function () {

    // Initialize a data table
    var myTable = $('#example').dataTable({
        // To use themeroller theme
        "bJQueryUI": true
    });

    // Make every cell editable
    $('td', myTable.fnGetNodes()).editable('@(Url.Action("Edit", "Home"))',
    {
        indicator: 'saving...',
        tooltip: 'click to edit...',
        style: 'inherit',
        placeholder: 'click to edit'
    });
});

И действие контроллера, которое я использовал для сохранения отредактированных данных в db:

[HttpPost]
    public void Edit(HttpContext context)
    {
        string elementId = context.Request.Form["id"];
        string fieldToEdit = elementId.Substring(0, 4);

        //now take anything after those 4 and it is the Id:
        int idToEdit = Convert.ToInt32(elementId.Remove(0, 4));

        // the value is simply a string:
        string newValue = context.Request.Form["value"].Trim();

        var food = dbEntities.Foods.Single(i => i.FoodID == idToEdit);

        switch (fieldToEdit)
        {
            case "name": food.FoodName = newValue; break;
            case "amnt": food.FoodAmount = Convert.ToInt32(newValue); break;
            case "sdat": food.StorageDate = Convert.ToDateTime(newValue); break;
            case "edat": food.ExpiryDate = Convert.ToDateTime(newValue); break;
            case "type": food.FoodTypeID = Convert.ToInt32(newValue); break;
            case "cont": food.ContainerID = Convert.ToInt32(newValue); break;
            default: throw new Exception("invalid fieldToEdit passed");

        }
        dbEntities.SaveChanges();


        context.Response.Write(newValue); 
    }

Здесь действительно нужна некоторая помощь... Цените это ...

Ответы [ 2 ]

0 голосов
/ 21 июля 2011

Я как-то справляюсь, хотя мне все еще нужно МНОГИЕ последующие работы. Я изменяю свой контроллер, чтобы вернуть ActionResult и передать 2 параметра (id и значение), и я придерживаюсь Url.Action на моем View ..Это работает, хотя я не уверен, что делаю что-то не так ..

Вот часть моего контроллера:

[HttpPost]
    public ActionResult Edit(string id, string value)
    {
        string elementId = id;
        string fieldToEdit = elementId.Substring(0, 4);

        //now take anything after those 4 and it is the Id:
        int idToEdit = Convert.ToInt32(elementId.Remove(0, 4));

        // the value is simply a string:
        string newValue = value;

И сценарий:

// Make every cell editable
    $('td', myTable.fnGetNodes()).editable('@(Url.Action("Edit", "Home"))',
    {
        indicator: 'saving...',
        tooltip: 'click to edit...',
        style: 'inherit',
        placeholder: 'click to edit'
    });

Спасибо!

0 голосов
/ 20 июля 2011

Первый вопрос:

Url.Content() следует использовать для обслуживания статических файлов, например, JS или CSS, например

Url.Content("~/Scripts/jquery.js")

Он вернет прямой URL к этому статическому файлу. Начиная с ~, будет гарантировано использование правильного базового каталога (т. Е. Если вы запускаете приложение в виртуальном каталоге).

2-й вопрос:

Ваш метод действия должен возвращать ActionResult, чтобы быть идентифицированным как действие. Это может быть параметр меньше, потому что у вас есть доступ к HttpContext как свойство вашего класса контроллера.

[HttpPost]
public ActionResult Edit()
{
    string elementId = this.HttpContext.Request.Form["id"]; 
}
...