dotnet / razor

Compiler and tooling experience for Razor ASP.NET Core apps in Visual Studio, Visual Studio for Mac, and VS Code.
https://asp.net
MIT License
499 stars 191 forks source link

Blazor wasm: RZ9991 build error when updating from 7.0.203 to 7.0.302 sdk #8725

Closed almightyju closed 1 year ago

almightyju commented 1 year ago

Is there an existing issue for this?

Describe the bug

When using a control WrappedSwitch that extends another control WrappedCheckbox which then extends InputBase<bool> using the WrappedSwitch with @bind-Value="SomeBool" will compile ok in 7.0.203 but in 7.0.302 results in:

error RZ9991: The attribute names could not be inferred from bind attribute 'bind-Value'. Bind attributes should be of the form 'bind' or 'bind-value' along with their corresponding optional parameters like 'bind-value:event', 'bind:format' etc.

Expected Behavior

The code should compile in both sdk vesions

Steps To Reproduce

Create a new blazor wasm project from a template.

In the shared folder create the following controls:

WrappedCheckbox

@using System.Diagnostics.CodeAnalysis
@inherits InputBase<bool>

<div class="form-check @WrapperDivCSS">
    <input id="@Id" class="form-check-input" type="checkbox" @bind="CurrentValue" @attributes="AdditionalAttributes" />
    <label class="form-check-label" for="@Id">@Label</label>
</div>

@code {
    [Parameter] public string? Label { get; set; }
    [Parameter] public string? WrapperDivCSS { get; set; }

    string Id { get; init; } = Guid.NewGuid().ToString();

    protected override bool TryParseValueFromString(string? value, out bool result, [NotNullWhen(false)] out string? validationErrorMessage)
    {
        bool parsed = bool.TryParse(value, out result);
        validationErrorMessage = parsed ? null : $"Failed to parse {value} as a boolean";
        return parsed;
    }
}

WrappedSwitch

@inherits WrappedCheckbox

<WrappedCheckbox Label="@Label" Value="@Value" ValueChanged="@ValueChanged" ValueExpression="@ValueExpression"
                 DisplayName="@DisplayName" WrapperDivCSS="form-switch" AdditionalAttributes="@AdditionalAttributes" />

@code {
}

Then replace the Index page with:

@page "/"

<PageTitle>Index</PageTitle>

<EditForm Model="EditItem">
    <WrappedSwitch Label="My Switch" @bind-Value="EditItem.MyProp"/>
</EditForm>

@code {
    public class EditModel
    {
        public bool MyProp { get; set; }
    }
    public EditModel EditItem { get; set; } = new();
}

Compile using both sdks and 203 will succeed while 302 fails

Exceptions (if any)

No response

.NET Version

No response

Anything else?

No response

ScarletKuro commented 1 year ago

Probably related https://github.com/dotnet/razor/issues/8718

fretje commented 1 year ago

I have the same issue (a component that's derived from a base component and the property to @bind to is in the base component).

This is blocking for us. I have to pin the sdk version to 7.0.203 to be able to build.

It's very strange behavior to say the least... the compiler is complaining, but the error is not visible in the code (with the red squiggle) like it normally is.

When I use @bind-Value (where the Value and ValueChanged properties are defined in the base class) like this;

<MyComponent @bind-Value="_value" />

I get:

error RZ9991: The attribute names could not be inferred from bind attribute 'bind-Value'. Bind attributes should be of the form 'bind' or 'bind-value' along with their corresponding optional parameters like 'bind-value:event', 'bind:format' etc.

And when I remove the @bind-Value:

<MyComponent />

I get another error:

error RZ10012: Found markup element with unexpected name 'MyComponent'. If this is intended to be a component, add a @using directive for its namespace.

I have tried adding a @using statement, or fully qualifying the namespace, but nothing helps.

ArgoZhang commented 1 year ago

same issue. it work fine use 7.0.203

jjonescz commented 1 year ago

Sorry you're hitting this. Seems like a regression fixed by https://github.com/dotnet/razor/pull/8614 but not yet in .NET 7. To confirm, try if your code works with .NET 8 SDK preview.

fretje commented 1 year ago

I found a way around it, by reading some of the other issues that have been posted about this.

I simply had to derive the "most" base component in the hierarchy chain from ComponentBase explicitly (in a the .razor.cs file), and this fixed the errors for us.

sam-wheat commented 1 year ago

I simply had to derive the "most" base component in the hierarchy chain from ComponentBase explicitly (in a the .razor.cs file), and this fixed the errors for us.

Does not work for me.

bobwinners commented 1 year ago

I am having this same issue. Addng ComponentBase to the base class (partial) in a razor.cs file didnt help

sam-wheat commented 1 year ago

@bobwinners

Try splitting your BasePage into two physical files (.cs and .razor).

BasePage.cs should look like this:

public partial class BasePage : ComponentBase
{
    //...
}

This worked for me.

bobwinners commented 1 year ago

@sam-wheat I tried that and it didn't work. Thanks.

ScarletKuro commented 1 year ago

@bobwinners you should stick with previous SDK using global.json

{
  "sdk": {
    "version": "7.0.203"
  }
}

More info: https://learn.microsoft.com/en-us/dotnet/core/tools/global-json

ghost commented 1 year ago

This issue has been automatically marked as stale because it has been marked as requiring author feedback but has not had any activity for 7 days. It will be closed if no further activity occurs within 7 days of this comment. If it is closed, feel free to comment when you are able to provide the additional information and we will re-investigate.

Please see our Issue Management Policies for more information.

jjonescz commented 1 year ago

Closing as duplicate of https://github.com/dotnet/razor/issues/8718.