Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC EF6异步删除_C#_Asp.net Mvc - Fatal编程技术网

C# MVC EF6异步删除

C# MVC EF6异步删除,c#,asp.net-mvc,C#,Asp.net Mvc,在我的控制器中,我有动作 [HttpPost, ActionName("Delete")] [ValidateAntiForgeryToken] public async Task<ActionResult> DeleteConfirmed(int id) { clsHost HostDAL = new clsHost(); vw_Host vw_host = await HostDAL.GetByIdAsync(id); string actionStatu

在我的控制器中,我有动作

[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> DeleteConfirmed(int id)
{
    clsHost HostDAL = new clsHost();
    vw_Host vw_host = await HostDAL.GetByIdAsync(id);
    string actionStatus = HostDAL.Delete(vw_host);

    TempData["msgHost"] = actionStatus;
    return RedirectToAction("Display");
}
Mi的问题是,当我使用Async DeleteConfirmation操作时,在Delete方法中我得到了错误:

对象引用未设置为对象的实例

为了

另一方面,当我使用同步操作时:

[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
    clsHost HostDAL = new clsHost();
    vw_Host vw_host = HostDAL.GetById(id);
    string actionStatus = HostDAL.Delete(vw_host);

    TempData["msgHost"] = actionStatus;
    return RedirectToAction("Display");
}
一切正常,
HttpContext.Current.User.Identity.Name
未返回任何错误。
只有删除操作才会出现此问题。它可以很好地用于编辑动作(甚至它的异步)。

你也可以考虑在你的<代码> Acyc之前调用该用户,并将其作为参数传递给Delphi方法。

[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> DeleteConfirmed(int id) {
    var name = "Unknown";
    try {
        name = HttpContext.Current.User.Identity.Name.ToString();
    }catch { }
    clsHost HostDAL = new clsHost();
    vw_Host vw_host = await HostDAL.GetByIdAsync(id);
    string actionStatus = HostDAL.Delete(vw_host, name);

    TempData["msgHost"] = actionStatus;
    return RedirectToAction("Display");
}

首先,确保
HttpContext.User
确实不是
null
。然后看
sp\u Host\u Delete
是存储过程吗?SP不支持异步。您还应该考虑在异步调用之前抓取用户并将其作为参数传递给删除。method@haim770-它是null,我想知道为什么异步操作会出现这种情况。@Salar-它的存储过程,但即使我在到达存储过程之前设置了一个变量,它也会返回null。我对Edit方法有精确的操作,它工作正常-即使它是异步的。注释中@haim770提供的链接确实提供了我检查的行为的一些细节,当我将HttpContext.Current.User.Identity.Name.ToString()移动到控制器操作时,它仍然为空。我必须添加字符串actionedBy=System.Web.HttpContext.Current.User.Identity.Name;在Delete的第一项行动中,它成功了。我把它放在vw_Host vw_Host=wait HostDAL.GetByIdAsync(id)之后;但这就是答案中建议的。我不知道这是否重要。
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
    clsHost HostDAL = new clsHost();
    vw_Host vw_host = HostDAL.GetById(id);
    string actionStatus = HostDAL.Delete(vw_host);

    TempData["msgHost"] = actionStatus;
    return RedirectToAction("Display");
}
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> DeleteConfirmed(int id) {
    var name = "Unknown";
    try {
        name = HttpContext.Current.User.Identity.Name.ToString();
    }catch { }
    clsHost HostDAL = new clsHost();
    vw_Host vw_host = await HostDAL.GetByIdAsync(id);
    string actionStatus = HostDAL.Delete(vw_host, name);

    TempData["msgHost"] = actionStatus;
    return RedirectToAction("Display");
}
public string Delete(vw_Host host, string name) {
    ObjectParameter executionStatus = new ObjectParameter("ExecutionStatus", "");

    try {
        using (Entities context = new Entities()) {
            context.sp_Host_Delete(host.ID, name, executionStatus);
            context.SaveChanges();
        }
    } catch (Exception ex) {
        using (Entities context = new Entities()) {
            context.sp_LogError(this.GetType().Name.ToString() + "." + System.Reflection.MethodBase.GetCurrentMethod().Name.ToString(), ex.Message, name);
            context.SaveChanges();
        }

        executionStatus.Value = "Error occured. Please contact to Administrator";
    }

    return executionStatus.Value.ToString();
}