You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Razor Page中获取Azure Data Table的ETag值

解决Azure.Data.Table中ETag在Razor Page提交时为空的问题

问题原因

Azure.Data.Table库中的ETag是**Azure.ETag类型**,而非字符串。当你通过asp-for="ETag"生成隐藏域时,Razor会调用该类型的ToString()方法,输出格式为{W/"'xxx'"}(带大括号的包裹格式),但默认模型绑定无法将这种格式的字符串正确反序列化为ETag对象,最终导致控制器接收的ETag值为空(显示为{})。

解决方案

方案1:添加字符串辅助属性(最简便)

修改Product模型,新增一个字符串类型的辅助属性,用于页面绑定和ETag值的转换:

public class Product : ITableEntity
{
    // 原有TableEntity属性
    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
    public DateTimeOffset? Timestamp { get; set; }
    public ETag ETag { get; set; }

    // 新增辅助属性,处理ETag的字符串转换
    public string ETagString
    {
        get => ETag.ToString().Trim('{', '}'); // 移除前后大括号
        set => ETag = ETag.Parse(value); // 将字符串解析为ETag对象
    }

    // 业务属性
    public string Name { get; set; }
    public decimal Price { get; set; }
    public int Stock { get; set; }
}

修改Razor页面的隐藏域绑定,替换为辅助属性:

<input type="hidden" asp-for="ETagString" />

控制器无需修改,直接使用product.ETag即可:

[HttpPost]
public async Task<IActionResult> Update(Product product)
{
    await _tableStorageService.UpdateAsync(product, product.ETag);
    return RedirectToAction("Index");
}

方案2:手动渲染隐藏域并解析

无需修改模型,在页面中手动输出ETag的原始值(不带大括号):

<input type="hidden" name="ETagValue" value="@Model.ETag.Value" />

控制器中接收字符串并手动解析为ETag:

[HttpPost]
public async Task<IActionResult> Update(Product product, [FromForm] string ETagValue)
{
    var validETag = ETag.Parse(ETagValue);
    await _tableStorageService.UpdateAsync(product, validETag);
    return RedirectToAction("Index");
}

方案3:自定义模型绑定器(全局复用)

如果多个页面需要处理ETag绑定,可以自定义模型绑定器统一处理转换逻辑:

public class ETagModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
            throw new ArgumentNullException(nameof(bindingContext));

        var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (valueResult == ValueProviderResult.None)
            return Task.CompletedTask;

        bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueResult);
        var rawValue = valueResult.FirstValue;

        if (string.IsNullOrEmpty(rawValue))
            return Task.CompletedTask;

        // 兼容带大括号和不带大括号的输入
        var cleanValue = rawValue.Trim('{', '}');
        bindingContext.Result = ModelBindingResult.Success(ETag.Parse(cleanValue));
        return Task.CompletedTask;
    }
}

在模型的ETag属性上标记绑定器:

public class Product : ITableEntity
{
    // ...其他属性

    [ModelBinder(BinderType = typeof(ETagModelBinder))]
    public ETag ETag { get; set; }
}

之后页面仍可直接使用asp-for="ETag",控制器能自动接收正确的ETag对象。

内容的提问来源于stack exchange,提问作者Salih Teyek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:25:26