将表单发布到控制器时,将错过ID

时间:2016-03-05 13:34:30

标签: c# .net asp.net-mvc-4 model-view-controller

我正在开发一个mvc网站。我有一个名为member的表。这个表有一个控制器,控制器有一个编辑方法,如你所见:

 public ActionResult Edit()
        {
            int userId = _memberRepository.ReturnMemberIdByMobile(User.Identity.Name);
            ViewBag.Edit = _memberRepository.FindById(userId).First();
            return View();
        }
        [HttpPost]
        public ActionResult Edit(Member value)
        {
            try
            {
                if (_memberRepository.Edit(value))
                {

                    value.RegisteredDate = DateTime.Now;
                    _memberRepository.Save();
                    TempData["Success"] = "با موفقیت ویرایش شد ...";
                    string strLocation = HttpContext.Server.MapPath("~/Image/users");
                    if (value.ImgByte != null)
                    {
                        value.ImgByte.SaveAs(strLocation + @"\" + value.Id + ".jpg");
                    }
                }

            }
            catch (Exception)
            {
                TempData["Error"] = "ویرایش نشد، لطفاً مجدداً تلاش نمایید";


            }
            return RedirectToAction("Edit");

        }

编辑视图正常工作。问题是当我发布视图编辑控制器时。成员的ID更改为0,这意味着它被遗漏。为什么?值不能被编辑。

  @using DCL
@{
    ViewBag.Title = "Edit";
    Layout = "~/Areas/user/Views/Shared/_shared.cshtml";
    Member membervalue = new Member();
    membervalue = ViewBag.Edit;

}

@using (@Html.BeginForm("Edit", "User", FormMethod.Post,
    new {id = "form", enctype = "multipart/form-data"}))
{
    if (TempData["Error"] != null)
    {
        <div class="pad margin no-print">
            <div class="callout callout-info" style="margin-bottom: 0 !important; background-color: #ea0000 !important; border-color: #d20000">
                @TempData["Error"]
            </div>
        </div>
    }
    if (TempData["Information"] != null)
    {
        <div class="pad margin no-print">
            <div class="callout callout-info" style="margin-bottom: 0 !important; background-color: orangered !important; border-color: red">
                @TempData["Information"]
            </div>
        </div>
    }
    if (TempData["Success"] != null)
    {
        <div class="pad margin no-print">
            <div class="callout callout-info" style="margin-bottom: 0 !important; background-color: #00A65A !important; border-color: #00925A">
                @TempData["Success"]
            </div>
        </div>
    }
    <div class="row">
        <!-- general form elements -->
        <div class="col-xs-12">
            <div class="box">
                <div class="box box-primary">
                    <div class="box-header with-border">
                        <h3 class="box-title">حساب کاربری</h3>
                    </div>
                    <!-- /.box-header -->
                    <!-- form start -->
                    <div class="box-body">
                        <div class="col-lg-7">
                            <div class="input-group">
                                <label for="Name">نام</label>
                                <input class="form-control" id="Name" name="Name" type="text" value="@membervalue.Name">
                            </div>
                            <div class="input-group">
                                <label for="family">نام خانوادگی</label>
                                <input class="form-control" id="family" name="family" type="text" value="@membervalue.Family">
                            </div>
                            <div class="input-group">
                                <label for="mobile">موبایل</label>
                                <input class="form-control" id="mobile" name="mobile" type="text" value="@membervalue.Mobile">
                            </div>
                            <div class="input-group">
                                <label for="password">رمز عبور</label>
                                <input class="form-control" id="password" name="password" type="password" value="@membervalue.Password">
                            </div>
                            <div class="input-group">
                                <label for="Email">ایمیل</label>
                                <input class="form-control" id="Email" name="Email" type="text" value="@membervalue.Email">
                            </div>
                            <div class="form-group">
                                <label for="ImgByte">عکس </label>
                                <input id="ImgByte" name="ImgByte" type="file">
                            </div>
                                     <input type="hidden"  id="Id" name="id" value="@membervalue.Id">

                        </div>
                    </div>
                    <!-- /.box-body -->
                </div>
            </div>
        </div>
        <!-- /.box -->

    </div>
        <div class="row" style="margin: 0; margin-bottom: 20px">
        <div class="box-footer" style="direction: ltr">
            <button type="submit" class="btn btn-info">ویرایش</button>
            <a class="btn btn-gray" href="@Url.Action("Index", "Home", null)">انصراف</a>
        </div>
    </div>
}

2 个答案:

答案 0 :(得分:1)

您应该将模型作为强类型对象传递,而不是使用模型的视图包。您可以通过Action中的以下更改执行此操作。然后在您的视图中定义顶部的模型,您可以在整个代码中使用它。 您还需要一个@ Html.HiddenFor标记作为您的ID。现在不再可能(没有编译时异常)创建一个type-o。在您之前的代码上,您可能会错误地输入ID,这会导致它不会被填充或者表单字段名称没有正确套装。这会将所有这些手动错误排除在外。

    public ActionResult Edit()
    {
        int userId = _memberRepository.ReturnMemberIdByMobile(User.Identity.Name);
        var model = _memberRepository.FindById(userId).First();
        return View(model); // pass this in as the model, do not use viewbag
    }

查看

@model = Member @* namespace qualified type *@

@*... editor code *@
@Html.HiddenFor(x => x.Id)
@Html.TextboxFor(x => x.Name) @* do this instead of manual input *@

答案 1 :(得分:0)

我运行了你的代码,并没有错误。 Id正确传递给编辑(后)操作。在您显示的代码中它可以为空的唯一原因是FindById返回没有Id属性设置的实体。