在 ASP.NET MVC5 中,表 ID 未从视图传递到控制器

Posted

技术标签:

【中文标题】在 ASP.NET MVC5 中,表 ID 未从视图传递到控制器【英文标题】:table id is not passing from view to controller in ASP.NET MVC5 【发布时间】:2014-02-12 18:27:38 【问题描述】:

我正在使用 asp.net mvc5 应用程序,并且我有 partialView 用于添加和删除操作,并且我有单独的 actionResult 来处理每个请求,根据 jQuery Ajax 函数触发......我得到了数字问题当我尝试编辑记录时。它在 HttpGet actionResult 中选择正确的记录并显示在屏幕上,但是当我提交带有更新字段的记录时,它不会在数据库中更新该记录,这是因为它不会将 recordID PK 发送回控制器中的操作,除非我使用隐藏值对于视图中的主键...但是我无法创建新记录!

局部视图

@model DatabaseLayer.TableMappings.FeeZone

<script>

    function CancelPage() 
        $.ajax(
            type: "POST",
            url: "/Qualification/FeeZoneHome",
            dataType: 'json',
            success: function (jsonData) 
                window.location = jsonData.redirectUrl;
            ,
            error: function (error) 
            
        );
       
</script>

@using (html.BeginForm())

 @Html.AntiForgeryToken()

 <div class="form-horizontal">
    <h4>FeeZone</h4>
    <hr />
    @Html.ValidationSummary(true)

    <!--<div class="form-group">
        <div class="col-md-10">
            @Html.HiddenFor(model => model.FeeZoneID)
        </div>
    </div>-->

    <div class="form-group">
        @Html.LabelFor(model => model.FeeZoneDescription, new  @class = "control-label col-md-2" )
        <div class="col-md-10">
            @Html.EditorFor(model => model.FeeZoneDescription)
            @Html.ValidationMessageFor(model => model.FeeZoneDescription)
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Save" class="btn btn-default">
            <input type="button" value="Cancel" class="btn btn-default" onclick="CancelPage();" />
        </div>
    </div>
</div>

控制器方法

    [HttpGet]
    public ActionResult EditFreeZoneByID(string FreeZoneID)
    
        int numID = Convert.ToInt32(FreeZoneID);
        return PartialView("Partial_CreateNewFreeZone", Q_UOF.GetFreeZoneByID(numID));
    

    [HttpPost]
    public ActionResult EditFreeZoneByID(FeeZone obj)
    
        try
        
            if (ModelState.IsValid)
            

                Q_UOF.EditSubject(obj);

            
        
        catch (DataException)
        
            ModelState.AddModelError("FeeZone", "Unable to Save Changes.");
        

        return RedirectToAction("FreeZone");
    

【问题讨论】:

为什么不能创建新记录?解释 如果我使用隐藏的记录 ID(参考部分页面代码),那么它不能......我只想使用上面的部分视图编辑记录而不放置隐藏的记录 ID @toxic 如果要更新现有记录,则必须发回 id,并且需要将其放在页面中(隐藏字段) 【参考方案1】:

您需要将表单中的主键值发送到您的 Action 方法,以便它可以更新正确的记录。为此,您绝对需要将表单中的 ID 保留在隐藏字段中。

我不确定“如果保留隐藏变量,则无法创建新记录”是什么意思。我不认为这会是一个问题。您可以使用相同的 HttpPost 操作方法来保存新记录并更新现有记录。您可以简单地检查主键属性的值,如果为 0,则添加新记录,否则更新现有记录

[HttpPost]
public ActionResult EditFreeZoneByID(FeeZone obj)

  if(obj.FreeZoneID==0)
  
    //This is a new record. Save it

  
  else
  
    //Update an existing record now. 
  
  // to do : Return somethign valid or redirect

【讨论】:

我更喜欢将两个业务关注点分开,但同时我不想要很多与操作相关的页面!

以上是关于在 ASP.NET MVC5 中,表 ID 未从视图传递到控制器的主要内容,如果未能解决你的问题,请参考以下文章

在 asp.net MVC5 EF6 中使用流利的 api 映射表?

使用 2 个表实现 ASP.NET MVC5 搜索功能

ASP.NET MVC5 实现 SQL 查询工具

在 ASP.NET MVC5 中使用 Steam 登录

asp.net mvc5 action多个参数

ASP.NET MVC5 我不想合并 CSS 文件