如何从Index.cshtml存储和编辑数据

时间:2016-08-03 17:06:24

标签: c# asp.net-mvc entity-framework razor visual-studio-2015

我有一个包含4个字段的模型:

    public string facility { get; set; }
    public string hub{ get; set; }
    public double customerCount { get; set; }
    public double cmtsValue { get; set; }

cmtsValue是customercount除以此处显示的每个customerCount的总和:

        @{     
                double totalValues = Model.Sum(c => c.customerCount);
                double cmtsValue = (item.customerCount / (totalValues * 1.0));
                @Html.Raw(cmtsValue.ToString("0.##%"))
        }

此公式使用Razor Code在Index.cshtml中完成。在视图中它正确显示但在数据库中它仍然存储为0, 如何直接从index.cshtml保存更改或编辑值?我尝试使用Create.cshtml和Edit.cshtml中的方法,但我没有运气

编辑:我尝试做的是在我的ViewController中添加一个方法:

    public void SaveCMTSValue(int? id, double totalValues, double cmtsValue)
    {
        FacilityEditor facilityEditor = db.FacilityEditor.Find(id);
        if(ModelState.IsValid)
        {
            facilityEditor.cmtsValue = cmtsValue;
            db.SaveChanges();
        }

    }

然后在我的Index.cshtml中是以下代码:

        @{


            double totalValues = Model.Sum(c => c.customerCount);
            double cmtsValue = (item.customerCount / (totalValues * 1.0));
                @Html.Raw(cmtsValue.ToString("0.##%"))


            @Html.ActionLink("SaveCMTSValue", "SaveCMTSValue", "FacilityEditor", new { id = item.ID, totalValues = totalValues, cmtsValue = cmtsValue })

        }

但是我只是得到一个错误,如果我想自动添加数据,那么是替代动作链接吗?

错误: 在执行当前Web请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。

1 个答案:

答案 0 :(得分:0)

您正在使用Html.ActionLink方法的错误重载。

使用此

 @Html.ActionLink("SaveCMTSValue", "SaveCMTSValue", "FacilityEditor"
            , new { id = item.ID, totalValues = totalValues, cmtsValue = cmtsValue }
            , new { id="saveCmt"})

这将生成一个链接并单击链接,其中包含与您的操作方法参数名称匹配的查询字符串值,因此模型绑定将起作用。

现在,当用户点击链接时,它将是对SaveCMTSValue操作方法的GET请求,其中包含查询字符串中的id,totalValues和cmtsValues。这意味着任何人都可以尝试访问url并在querystring参数中传递您想要的任何数据,并且您的代码会将其保存到db表中。

通常,使用HttpPost操作更新db表值是个好主意。所以我建议你将你的动作方法转换为HttpPost类型。

[HttpPost]
public void SaveCMTSValue(int? id, double totalValues, double cmtsValue)
{
      // save
}

现在点击链接通常会发出GET请求。为了使这个工作与HttpPost,我们需要捕获此链接上的click事件,并使用ajax发出HttpPost调用。

$(function(){

  $("#saveCmt").cilck(function(e){
     e.preventDefault();
     $.post($(this).attr("href"),function(res){
        alert("Updated");
     });
  });

});

我还建议您只使用 id 并再次获取数据并进行计算并在操作方法中再次生成值并使用该值进行保存。

[HttpPost]
public void SaveCMTSValue(int? id)
{
  // with id, get the releavnt data, generate the value and save
}