【问题标题】:Access object property values访问对象属性值
【发布时间】:2013-05-16 16:19:33
【问题描述】:

如何在下面的代码中验证“成功”是真还是假?我已尝试使用以下代码,但无法正常工作:

if (result["success"].Equals(false)) throw new Exception(result["message"].ToString());

if (result["message"].ToString().Contains("maximum limit reached")) throw new Exception(result["message"].ToString());

这是我的行动:

[HttpPost]
    public ActionResult PostFile(string NewFileName, string FileNumber)
    {

        try
        {
            var result = ((JsonResult)(SaveFile(NewFileName, FileNumber))).ToDictionary();
            if (result.Keys.Contains("message")) throw new Exception(result["message"].ToString());
            //if (result["success"].Equals(false)) throw new Exception(result["message"].ToString());

            return Content("success");
        }
        catch (Exception ex)
        {
            return Content(ex.ToString());
        }

    }

    public ActionResult SaveFile(string status, string FileNumber)
    {

        try
        {
            var currentPath = ConfigurationManager.AppSettings["FilePath"]; 
            string filename = FileNumber + ".pdf";
            var ext = UploadHandler.SaveUploadedFile(Path.GetDirectoryName(currentPath), filename);
            return Json(new { success = true }, "text/html"); 
        }
        catch (Exception ex)
        {
            return Json(new { success = false, message = ex.Message }, "text/html");
        }
    }

非常感谢任何帮助

【问题讨论】:

  • 您需要解析您的输入。 bool.Parse(success) == false
  • @Romoku if (result["success"].Equals(bool.Parse(success) == false)) 没有抛出我想要的异常,而是去捕获
  • 我的意思是bool.Parse(result["success"]) == false
  • 得到一个错误:错误'bool.Parse(string)'的最佳重载方法匹配有一些无效参数

标签: c# asp.net-mvc jsonresult


【解决方案1】:

方法 1

private T GetValueFromJsonResult<T>(JsonResult jsonResult, string propertyName)
{
    var property =
        jsonResult.Data.GetType().GetProperties()
        .Where(p => string.Compare(p.Name, propertyName) == 0)
        .FirstOrDefault();

    if (null == property)
        throw new ArgumentException(propertyName + "not found", propertyName);
    return (T)property.GetValue(jsonResult.Data, null);
}

Boolean testValue = GetValueFromJsonResult<bool>(abc(), "Success");

private JsonResult abc()
{
    return Json(new { Success = true }, JsonRequestBehavior.AllowGet);
}

方法2

$.ajax({
    url: 'ControllerName/PostFile',
    data: JSON.stringify({ NewFileName: "FileName", FileNumber: "12" }),
    type: 'POST',
    contentType: 'application/json, charset=utf-8',
    dataType: 'json',
    beforeSend: function (xhr, opts) {
    }
}).done(function (data) {
    if(data.success) {
        alert('ok');
    }
});

【讨论】:

  • 有没有我可以在没有 JQuery-Ajax 的情况下访问“成功”属性?
  • 感谢您提供替代解决方案。但是我想知道如何在上面的代码中访问“成功”和/或“消息”对象属性。我相信我的方式应该可以正常工作,我发布了这个问题,以了解我是否遗漏了什么或做错了什么。谢谢!寻求帮助
【解决方案2】:

您可以使用Request.IsAjaxRequest() 方法分离出您的逻辑并组合方法。

private void UploadFile(string status, string fileNumber)
{
    var currentPath = ConfigurationManager.AppSettings["FilePath"]; 
    string filename = fileNumber + ".pdf";
    UploadHandler.SaveUploadedFile(Path.GetDirectoryName(currentPath), filename);
}

[HttpPost]
public ActionResult PostFile(string newFileName, string fileNumber)
{
    var isAjax = Request.IsAjaxRequest();

    try
    {
        UploadFile(newFileName, fileNumber);
    }
    catch (Exception ex)
    {
        if(isAjax)
        {
            return Json(new { success = false, message = ex.Message }, "text/html");
        }

        return Content(ex.ToString());
    }

    if(isAjax)
    {
        return Json(new { success = true }, "text/html"); 
    }

    return Content("success");
}

从 Javascript 调用:

$.ajax({
    type: 'POST',
    url: 'Controller/PostFile',
    data: { newFileName = '', fileNumber = '' },
    success: function(content) {
    }
});

【讨论】:

  • 我很确定我的代码是正确的。愿意解释反对意见吗?
  • 感谢您提供替代解决方案。但是我想知道如何在上面的代码中访问“成功”和/或“消息”对象属性。我相信我的方式应该可以正常工作,我发布了这个问题,以了解我是否遗漏了什么或做错了什么。谢谢!寻求帮助
猜你喜欢
  • 2021-03-05
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
相关资源
最近更新 更多