ASP.net MVC 3 Редактировать / Удалить проблему - PullRequest
1 голос
/ 28 марта 2012

Итак, я только что закончил работу над проектом на http://msdn.microsoft.com/en-us/data/gg685489. Я пытаюсь создать CRUD для использования с уже существующей внешней базой данных, и я просто использую проект в качестве руководства для своей собственной работы. Мне удалось изменить некоторые имена переменных и соединения для соединения с базой данных, с которой я пытаюсь работать, и я даже отобразил данные, которые я хочу, используя метод индекса. Мне также удалось заставить работать метод create, и я могу создавать новые данные в БД, с которой я работаю. К сожалению, я не смог получить данные при использовании методов «Правка» или «Удалить» или сохранить / удалить после внесения необходимых изменений.

Например, когда я нажимаю кнопку редактирования, она должна вытянуть запись, по которой я щелкнул, чтобы я мог редактировать информацию о конкретной записи, но вместо этого выдает ошибку, говорящую, что эта переменная не может принимать нулевое значение, поэтому я изменил int в строку в методах редактирования delete. Эта часть решена

Я думаю, что проблема связана с методами Edit и Delete, которые не извлекают набор записей, когда я говорю об этом. У кого-нибудь есть идеи, почему он не извлекает наборы записей, когда я редактирую / удаляю или сохраняю свои изменения после того, как я говорю это сохранить?

Я опубликовал свой класс PaController, в котором есть мои методы CRUD для диагностики, а также мой файл класса iamp_mapping, в котором есть 3 поля, с которыми мне нужно работать. Я на 90% уверен, что я делаю что-то не так с контроллером, но если вам понадобится больше кода / информации о проблеме, пожалуйста, оставьте мне записку, я буду проверять много, потому что я застрял! Большое спасибо за вашу помощь!

PaController

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using DBFirstMVC.Models;
using System.Data;

namespace DBFirstMVC.Controllers
{
    public class PaController : Controller
    {
        PaEntities db = new PaEntities();
        //
        // GET: /Pa/

        public ActionResult Index()
        {
            using (var db = new PaEntities())
            {
                return View(db.iamp_mapping.ToList());
            }
        }

        //
        // GET: /Pa/Details/5

        public ActionResult Details(int id)
        {
            return View();
        }

        //
        // GET: /Pa/Create

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

        //
        // POST: /Pa/Create

        [HttpPost]
        public ActionResult Create(iamp_mapping IAMP)
        {
            try
            {
                using (var db = new PaEntities())
                {
                    db.iamp_mapping.Add(IAMP);
                    db.SaveChanges();
                }

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        //
        // GET: /Pa/Edit/5

        public ActionResult Edit(string id)
        {
            using (var db = new PaEntities())
            {
                return View(db.iamp_mapping.Find(id));
            }
        }

        //
        // POST: /Pa/Edit/5

        [HttpPost]
        public ActionResult Edit(string id, iamp_mapping IAMP)
        {
            try
            {
                using (var db = new PaEntities())
                {
                    db.Entry(IAMP).State = EntityState.Modified;
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
            }
            catch
            {
                return View();
            }
        }

        //
        // GET: /Pa/Delete/5

        public ActionResult Delete(string id)
        {
            using (var db = new PaEntities())
            {

                return View(db.iamp_mapping.Find(id));
            }
        }

        //
        // POST: /Pa/Delete/5

        [HttpPost]
        public ActionResult Delete(string id, iamp_mapping IAMP)
        {
            try
            {
                using (var db = new PaEntities())
                {
                    db.Entry(IAMP).State = EntityState.Deleted;
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }

            }
            catch
            {
                return View();
            }
        }
    }
}

iamp_mapping

using System;
using System.Collections.Generic;

namespace DBFirstMVC.Models
{
    public partial class iamp_mapping
    {
        public string PA { get; set; }
        public string MAJOR_PROGRAM { get; set; }
        public string INVESTMENT_AREA { get; set; }
    }

}

Редактировать код просмотра

@model DBFirstMVC.Models.iamp_mapping

@{
    ViewBag.Title = "Edit";
}

<h2>Edit</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>iamp_mapping</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.PA)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.PA)
            @Html.ValidationMessageFor(model => model.PA)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.MAJOR_PROGRAM)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.MAJOR_PROGRAM)
            @Html.ValidationMessageFor(model => model.MAJOR_PROGRAM)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.INVESTMENT_AREA)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.INVESTMENT_AREA)
            @Html.ValidationMessageFor(model => model.INVESTMENT_AREA)
        </div>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

Index.cshtml

@model IEnumerable<DBFirstMVC.Models.iamp_mapping>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            PA
        </th>
        <th>
            MAJOR PROGRAM
        </th>
        <th>
            INVESTMENT AREA
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.PA)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.MAJOR_PROGRAM)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.INVESTMENT_AREA)
        </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { id=item.PA }) |
        @Html.ActionLink("Details", "Details", new { id=item.PA }) |
        @Html.ActionLink("Delete", "Delete", new { id=item.PA })
    </td>
</tr>

}

ActionLink - это то, что я должен был исправить, когда я впервые опубликовал вопрос, он выглядел следующим образом

@Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ })

Я изменил его на фактический первичный ключ PA и удалил комментарии. Это исправило проблему с незаполнением данных при попытке редактировать строку!

    <td>
        @Html.ActionLink("Edit", "Edit", new { id=item.PA }) |
        @Html.ActionLink("Details", "Details", new { id=item.PA }) |
        @Html.ActionLink("Delete", "Delete", new { id=item.PA })
    </td>
</tr>

}

Delete.cshtml

@model DBFirstMVC.Models.iamp_mapping

@{
    ViewBag.Title = "Delete";
}

<h2>Delete</h2>

<h3>Are you sure you want to delete this?</h3>
<fieldset>
    <legend>iamp_mapping</legend>

    <div class="display-label">PA</div>
    <div class="display-field">
        @Html.DisplayFor(model => model.PA)
    </div>

    <div class="display-label">MAJOR_PROGRAM</div>
    <div class="display-field">
        @Html.DisplayFor(model => model.MAJOR_PROGRAM)
    </div>

    <div class="display-label">INVESTMENT_AREA</div>
    <div class="display-field">
        @Html.DisplayFor(model => model.INVESTMENT_AREA)
    </div>
</fieldset>
@using (Html.BeginForm()) {
    <p>
        <input type="submit" value="Delete" /> |
        @Html.ActionLink("Back to List", "Index")
    </p>
}

Global.asax.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace DBFirstMVC
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Pa", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );

        }

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

1 Ответ

0 голосов
/ 28 марта 2012

Ваша проблема здесь заключается в том, что когда вы нажимаете на кнопку / ссылку редактирования, действие Edit будет ожидать идентификатор типа int (если вы используете int), однако это можно сделать необязательным, если вы используете int? ...так ведет себя MVC ... лучше всего попытаться использовать URL-адрес, например, http://urwebsite.com/Pa/Edit?id=[use действительный идентификатор] ... с этим у вас будет идентификатор в действии редактирования ...

Обновление

Я думаю, что проблема, с которой вы здесь сталкиваетесь, заключается в том, что значение Id в методе действия Edit равно нулю ... и движок MVC не может распознать значение id из вашегоШаблон URL

Итак, на странице, где у вас есть ссылка / кнопка редактирования, вы можете использовать что-то вроде

<a href="/Pa/Edit/@model.id">Edit</a>

Если у вас есть цикл for, где вы отображаете коллекцию записей ...

@foreach(var item in Model)

{

<a href="/Pa/Edit/@item.id">Edit</a>

}

Также убедитесь, что у вас настроена маршрутизация для шаблона URL / Pa / Edit / {id}

Вы можете прочитать это Article , если хотите узнать больше о маршрутизациив мвк.

Это будет гарантировать, что при получении запроса Get для метода действия редактирования будет распознано значение id

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

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