将匿名对象合并为单个匿名对象 - c#

在某些情况下,我需要传递一些路由值组合才能创建特定路由的URL。而不是使用令人困惑的堆叠if情况,例如:

(x != 0 && y != 0 ? (object)new { xId = 1, yId = 1 } : (x != 0 ? (object)new { xId = 1 } : (y != 0 ? (object)new { yId = 1 } : null)))

这就是2个值的4个可能的组合(一个或另一个,都不是)。

(以防您想知道为什么我需要if-cases,这是针对具有许多页面/链接的模板,但是根据使用方式,可以稍微不同地设置路由,而不必查找和更改我想要的每个链接能够根据路由的设置方式来不同地应用路由值,如果我不这样做,它将为未映射到路由值的值添加无用的查询字符串)

为了更容易阅读,最好有一种方法来合并匿名类型,例如:

Merge((x != 0 ? new { xId = 1 } : null), (y != 0 ? new { yId = 1 } : null))

我找到了此解决方案https://stackoverflow.com/a/6802728,但是我有一个问题,这取决于我对这里要处理的问题的理解。

这是此方法的变体:

public static dynamic Merge(params object[] objects)
{
    dynamic expando = new ExpandoObject();
    var merged = expando as IDictionary<string, object>;

    foreach (object obj in objects)
        if (obj != null)
            foreach (PropertyInfo property in obj.GetType().GetProperties())
                merged[property.Name] = property.GetValue(obj);

    return merged;
}

当我将此方法的输出(路由值)以及路由名称传递给HtmlHelper并期望它创建具有指定URL的html链接时,由于未找到匹配的路由,因此无法执行。似乎无法访问合并对象中的路由值。方法的返回类型是动态的,并且强制转换为对象或RouteValueDictionary没有区别。

输出对象与普通匿名对象有何不同?有没有办法使它能够访问合并对象内的键/值?

参考方案

在ASP.NET MVC中,诸如Url.ActionHtml.ActionLink之类的HTML帮助器也具有重载,这些重载需要RouteValueDictionary。例如:

@{ var x = 1; var y = 1; }

@Html.ActionLink(
    "Go to contacts", "Contact", "Home",
    routeValues: 
        Merge(x != 0 ? new { xId = 1 } : null, y != 0 ? new { yId = 1 } : null),
    htmlAttributes: null))

使用此重载,可以通过以下方式实现Merge方法:

public static RouteValueDictionary Merge(params object[] routeValuesObjects)
{
    var result = new RouteValueDictionary();

    foreach (var routeValues in routeValuesObjects)
        foreach (var item in new RouteValueDictionary(routeValues))
            result[item.Key] = item.Value;

    return result;
}

ASP.NET MVC 5自定义登录,无需脚手架,数据库优先 - c#

我对asp.net和mvc还是很陌生,所以我正在努力学习尽可能多的知识...为此,我从头开始编写博客网站,但是我对身份验证和授权有些困惑。由于我倾向于不真正使用任何脚手架的东西,所以我首先要使用数据库,所以不希望asp.net身份为我创建表。我对散列和加盐密码很酷,并对照数据库检查用户,我遇到的麻烦是将用户设置为登录状态并检查他们应该能够访问什么。我真的很想…

ddl在服务器中未更新-asp.net - javascript

我在ASP.NET c#上工作。我有一个DropDownList。 (runat =“ server”)在$ {document).ready上,我更新了它的值:$(document).ready(function () { document.getElementById("ddl").value = "abc"; ……

asp.net mvc或javascript将另一页的结果返回给方法 - c#

是否可以将另一个页面的结果返回给JavaScript方法或C#控制器操作?我有一个共享的复杂页面,该页面在我的网站上遍布使用,当前用于在C#后端的用户数据上设置单个变量。当用户完成共享的复杂页面后,我将返回引用页面。当用户在刷新或返回时将其作为url参数传递给返回的页面时,我返回的页面包含新选择的变量。我有一个新页面,我希望从我的共享复杂页面中返回该变量。但…

MVC C#TempData - c#

有人可以解释一下MVC中TempData的目的。我了解它的行为类似于ViewBag,但除此之外它还有什么作用。 参考方案 TempData应该是一个短暂的实例,您应该 仅在当前和后续请求中使用它!以来 TempData以这种方式工作,您需要确定下一步 要求,并且重定向到另一个视图是您唯一的时间 可以保证这一点。因此,唯一使用TempData的方案 在重定向时…

ASP.NET-如何更改JSON序列化的方式? - javascript

我正在使用ASP.NET通过以下查询返回Json文件:public ActionResult getTransactionTotals(int itemID) { DBEntities db = new DBEntities(); var query = from trans in db.Transactions // Linq query removed …